Java JPA@ManyToOne-EntityNotFoundException或空值?

Java JPA@ManyToOne-EntityNotFoundException或空值?,java,hibernate,jpa,eclipselink,Java,Hibernate,Jpa,Eclipselink,当我们调用manytone注释字段的getter方法时,EclipseLink或Hibernate之类的持久性提供程序使用find()或getReference()加载实体 find()如果EntityNotFound,则返回null getReference()抛出一个EntityNotFoundException 那么,如果找不到实体,getter应该做什么呢 在引擎盖下是一个持久性提供者,比如EclipseLink或Hibernate uses find() or getReference

当我们调用
manytone
注释字段的getter方法时,EclipseLink或Hibernate之类的持久性提供程序使用
find()
getReference()
加载实体

find()
如果EntityNotFound,则返回
null

getReference()
抛出一个
EntityNotFoundException

那么,如果找不到实体,getter应该做什么呢

在引擎盖下是一个持久性提供者,比如EclipseLink或Hibernate

uses find() or getReference()  
在调用多个带注释字段的getter方法时加载实体

Hibernate不会在幕后调用find或GetReference。这些方法用于客户端定位实体或代理

如果您有一个
@ManyToOne
关联,Hibernate已经知道如何获取父实体,因为在幕后,JPA
@ManyToOne
只是一个外键

但是Hibernate在导航关联时已经知道FK的值,因为加载子实体的原始
ResultSet
也包含FK的值

但是,Hibernate不必转到DB,因为加载周期如下:

  • 将在一级缓存中搜索所需的实体
  • 如果在第一级缓存中找不到任何内容,Hibernate将尝试在第二级缓存中找到它
  • 如果仍然找不到实体,则将发出二次查询,因为关联必须是惰性的
  • 因此,实际上,在导航FK时不需要
    EntityNotFoundException
    ,因为子项不能引用不存在的父记录。如果您没有使用FK,并且数据库中存在这种不一致性,那么Hibernate确实会抛出异常。但这会告诉您,您的数据建模设计可能已被破坏

    在引擎盖下是一个持久性提供者,比如EclipseLink或Hibernate

    uses find() or getReference()  
    
    在调用多个带注释字段的getter方法时加载实体

    Hibernate不会在幕后调用find或GetReference。这些方法用于客户端定位实体或代理

    如果您有一个
    @ManyToOne
    关联,Hibernate已经知道如何获取父实体,因为在幕后,JPA
    @ManyToOne
    只是一个外键

    但是Hibernate在导航关联时已经知道FK的值,因为加载子实体的原始
    ResultSet
    也包含FK的值

    但是,Hibernate不必转到DB,因为加载周期如下:

  • 将在一级缓存中搜索所需的实体
  • 如果在第一级缓存中找不到任何内容,Hibernate将尝试在第二级缓存中找到它
  • 如果仍然找不到实体,则将发出二次查询,因为关联必须是惰性的

  • 因此,实际上,在导航FK时不需要
    EntityNotFoundException
    ,因为子项不能引用不存在的父记录。如果您没有使用FK,并且数据库中存在这种不一致性,那么Hibernate确实会抛出异常。但这会告诉您,您的数据建模设计可能已被破坏。

    感谢Indes提供的答案!我在我的一个项目中使用EclipseLink,我没有强制执行FK CostRain,当我在多通关联上调用getMyEntity时,我只得到一个空值。这与JPA规范一致吗?你应该询问EclipseLink团队。我不认为JPA规定了一个不存在的协会的标准结果。非常感谢Vlad!谢谢你的回答!我在我的一个项目中使用EclipseLink,我没有强制执行FK CostRain,当我在多通关联上调用getMyEntity时,我只得到一个空值。这与JPA规范一致吗?你应该询问EclipseLink团队。我不认为JPA规定了一个不存在的协会的标准结果。非常感谢Vlad!