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

问题描述 投票:0回答:1

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

jpa proxy lazy-initialization
1个回答
0
投票

事实上,我很惊讶你正面临着这个问题。根据这个问题:Making a OneToOne-relation lazy,懒惰的可选多对一协会应该工作得很好;它是导致问题的一对一关联。这里的问题是没有增强功能,Hibernate无法自动将代理转换为null引用。你真的在Hibernate中看到这种行为吗?

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

© www.soinside.com 2019 - 2024. All rights reserved.