java - JPA @ManyToOne - EntityNotFoundException 或 null 值?

标签 java hibernate jpa eclipselink

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

find() 如果 EntityNotFound 返回 null

getReference() 抛出 EntityNotFoundException

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

最佳答案

Under the hood a persistence Provider like EclipseLink or Hibernate

uses find() or getReference()  

to load entities when we call getter methods of a ManyToOne annotated field?

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

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

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

但是,Hibernate 并不强制去数据库,因为加载周期如下:

  1. 在一级缓存中搜索您需要的实体
  2. 如果一级缓存中没有找到任何内容,Hibernate 会尝试在二级缓存中查找它
  3. 如果仍未找到实体,则将发出辅助查询,因为关联必须是 LAZY。

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

关于java - JPA @ManyToOne - EntityNotFoundException 或 null 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43202801/

相关文章:

java - 为什么在使用 DefaultParser 而不是 GnuParser 时检测到的 CLI 选项不同?

java - MySQL : EOFException: Can not read response from server. 预计读取 4 个字节,在连接意外丢失之前读取了 0 个字节

java - 通过 JPA 注释的聚合关系

java - 如何使用 JPA 和 Hibernate 映射集合的最新子项

java - try catch 循环(InputMismatchException 和 ArrayIndexOutOfBoundsException 之间的区别)

java - 为什么我的 Java 程序不会使用 KeyListener 确认任何击键?

java.lang.NoClassDefFoundError : Could not initialize class Hibernate. util.HibernateUtil

java - 我对 Maven 依赖项 : "org.eclipse.persistence.jpa" and "org.hibernate" 感到困惑

java - Apache HttpClient(4.1 及更高版本): how to do basic authentication?

java - 从非常大的结果集中呈现数据的最佳方式是什么?