【问题标题】:JPA entity proxy issue comparing with null value与空值比较的 JPA 实体代理问题
【发布时间】:2018-01-09 23:40:33
【问题描述】:

像 Hibernate 这样的一些 JPA 提供程序使用代理来处理延迟初始化。考虑以下示例:

@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 提供程序是从该操作返回代理的类型,则它是一个问题。另一方面,如果 JPA 提供程序不返回代理(例如 DataNucleus),那么这不是问题。

标签: jpa proxy lazy-initialization


【解决方案1】:

事实上,我很惊讶您会遇到这个问题。根据这个问题:Making a OneToOne-relation lazy,惰性可选多对一关联应该可以正常工作;导致问题的是一对一的关联。这里的问题是,如果没有增强,Hibernate 无法自动将代理转换为 null 引用。您真的在 Hibernate 中看到了这种行为吗?

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

【讨论】:

    猜你喜欢
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 2012-03-15
    • 1970-01-01
    • 2019-04-11
    • 2011-02-03
    相关资源
    最近更新 更多