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实体代理问题与空值比较的主要内容,如果未能解决你的问题,请参考以下文章

DB2 SQLCODE = -420,将 smallint 字段与空值进行比较时出错

那些年我们踩过的坑,SQL 中的空值陷阱!

那些年我们踩过的坑,SQL 中的空值陷阱!

为啥在返回值之前将字符串与空值连接?

可选链与空值合并

熊猫将两列与空值结合起来