【问题标题】:JPA @ManyToOne - EntityNotFoundException or null value?JPA @ManyToOne - EntityNotFoundException 或空值?
【发布时间】:2017-04-04 09:08:22
【问题描述】:

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

find() 如果 EntityNotFound 则返回 null

getReference() 抛出 EntityNotFoundException

那么在找不到Entity的情况下getter应该怎么做呢?

【问题讨论】:

    标签: java hibernate jpa eclipselink


    【解决方案1】:

    在后台有 EclipseLink 或 Hibernate 等持久性提供程序

    uses find() or getReference()  
    

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

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

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

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

    不过,Hibernate 并不强制一定要去 DB,因为加载周期如下:

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

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

    【讨论】:

    • 非常感谢您的回答!我在我的一个项目中使用 EclipseLink,我没有强制执行 FK 约束,当我在 ManyToOne 关联上调用 getMyEntity 时,我只是得到一个空值。这是否符合 JPA 规范?
    • 您应该询问 EclipseLink 团队。我不认为 JPA 指定导航不存在的关联的标准结果应该是什么。
    • 非常感谢弗拉德!
    猜你喜欢
    • 2014-10-16
    • 2021-12-06
    • 2013-08-16
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 2014-11-01
    • 2023-01-11
    • 2019-03-31
    相关资源
    最近更新 更多