【发布时间】:2018-06-07 19:41:55
【问题描述】:
更新
我想指出@sainr 的回答Converting Hibernate proxy to real entity object 确实解决了这个问题。但幕后的问题是我的SiteEntity 有一个final 修饰符,它是setControllerEntity 和getControllerEntity,我没有在我的问题中提出。我很抱歉。
删除final 修饰符。然后Hibernate就可以很好的初始化代理对象了。
可以在 Stack Overflow 上的另一个 answer 中找到解释。
我有以下三个实体
@Entity
@Table(name = "controller")
public class ControllerEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(nullable = false, updatable = false)
private long id;
}
@Entity
@Table(name = "site")
public class SiteEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(nullable = false)
private long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "controller_id", nullable = false)
private ControllerEntity controllerEntity;
}
@Entity
@Table(name = "device")
public class DeviceEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(nullable = false)
private long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "site_id", nullable = true)
private SiteEntity siteEntity;
}
找到设备实体后,我尝试直接从中获取controllerEntity。
final DeviceEntity deviceEntity1 = deviceRepository.findOne(1L);
System.out.println(deviceEntity1.getSiteEntity().getControllerEntity().getId());
但它会产生一个java.lang.NullPointerException,这是由siteEntity 中的null controllerEntity 引起的。
此外,即使我尝试使用 siteRepositoy 再次获取 siteEntity。它的controllerEntity 仍然是null。
在我从 DeviceEntity 和 SiteEntity 中删除 fetch = FetchType.LAZY 后,NPE 不再发生。
但这似乎很奇怪,没有意义。我可以使用FetchType.LAZY 同时期待休眠获取正确的值吗?
谢谢。
【问题讨论】:
标签: java hibernate spring-boot lazy-loading