JPA实体代理问题与空值比较
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JPA实体代理问题与空值比较相关的知识,希望对你有一定的参考价值。
像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代理的问题吗?
答案
事实上,我很惊讶你正面临着这个问题。根据这个问题:Making a OneToOne-relation lazy,懒惰的可选多对一协会应该工作得很好;它是导致问题的一对一关联。这里的问题是没有增强功能,Hibernate无法自动将代理转换为null
引用。你真的在Hibernate中看到这种行为吗?
无论如何,您应该能够通过启用增强功能来解决问题。这样,如果初始化代理不表示有效的House
,Hibernate能够覆盖getter方法以返回null。但不确定其他提供商如何解决问题。
以上是关于JPA实体代理问题与空值比较的主要内容,如果未能解决你的问题,请参考以下文章