JPA @ManyToOne - EntityNotFoundException还是null值?

时间:2017-04-04 09:08:23

标签: java hibernate jpa eclipselink

当我们调用find()注释字段的getter方法时,像EclipseLink或Hibernate这样的持久性提供程序会使用getReference()ManyToOne来加载实体吗?

如果EntityNotFound

find()会返回null

getReference()会抛出EntityNotFoundException

那么在找不到实体的情况下,getter应该怎么做?

1 个答案:

答案 0 :(得分:0)

  

引发了一个持久性提供程序,如EclipseLink或Hibernate

uses find() or getReference()  
     

在我们调用ManyToOne注释字段的getter方法时加载实体?

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

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

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

但是,Hibernate并不是必须转到数据库,因为加载周期如下:

  1. 在第一级缓存中搜索您需要的实体
  2. 如果在第一级缓存中找不到任何内容,Hibernate会尝试在二级缓存中找到它
  3. 如果仍未找到实体,则会发出辅助查询,因为关联必须是LAZY。
  4. 因此,实际上,当我们导航FK时不需要EntityNotFoundException,因为孩子无法引用不存在的父记录。如果您没有使用FK并且数据库中存在这种不一致,那么Hibernate确实会抛出异常。但那会告诉你,你的数据建模设计可能已经破裂了。