像Hibernate这样的一些JPA提供程序使用Proxy来处理延迟初始化。请考虑以下示例:
@Entity
public class Person {
@Id
private Long id;
@ManyToOne(fetch=FetchType.LAZY)
private House house;
}
@Entity
public class House {
@Id
private Long id;
@Embedded
private Address address;
}
获取Person实体时,其house属性设置为Proxy(惰性)。
Person person = em.find(Person.class, 1);
House house = person.getHouse(); // Proxy
if (house == null)
System.out.println("has no house);
else
System.out.println("has a house");
如果此人没有房屋,则该人物对象具有房屋代理(非空)。上面的代码将打印错误的消息。这是JPA代理的问题吗?
答案 0 :(得分:0)
事实上,我很惊讶您正面临这个问题。根据这个问题:application permissions,懒惰的可选多对一关联应该可以正常工作;它是导致问题的一对一关联。这里的问题是,如果没有增强功能,Hibernate无法自动将代理转换为null
引用。你真的在Hibernate中看到这种行为吗?
在任何情况下,您都应该可以通过启用增强功能来解决问题。这样,如果初始化代理不表示有效的House
,Hibernate能够覆盖getter方法以返回null。但不确定其他提供商如何解决问题。