JPA实体代理问题与空值比较

时间:2018-01-09 23:40:33

标签: jpa proxy lazy-initialization

像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代理的问题吗?

1 个答案:

答案 0 :(得分:0)

事实上,我很惊讶您正面临这个问题。根据这个问题:application permissions,懒惰的可选多对一关联应该可以正常工作;它是导致问题的一对一关联。这里的问题是,如果没有增强功能,Hibernate无法自动将代理转换为null引用。你真的在Hibernate中看到这种行为吗?

在任何情况下,您都应该可以通过启用增强功能来解决问题。这样,如果初始化代理不表示有效的House,Hibernate能够覆盖getter方法以返回null。但不确定其他提供商如何解决问题。