【问题标题】:How can I determine if a JPA entity was read from the database or not?如何确定是否从数据库中读取了 JPA 实体?
【发布时间】:2013-05-14 20:58:12
【问题描述】:

有什么方法可以查出是否从数据库中读取了实体?

此问题与How to know if a detached JPA entity has already been persisted or not? 有关。但是检查其主键的解决方法不能回答我的问题。它不适用于从导入文件中读取主键的实体。

扩展问题:

JPA 实现如何确定是要插入还是更新实体?

【问题讨论】:

    标签: java jpa


    【解决方案1】:

    Hibernate 使用带有 @Version(用于乐观锁定)注释的字段的值(如果存在)来判断实体是瞬态的还是分离的。你也可以这样做。

    否则,不,没有办法。 POJO 是 POJO。如果不存在 @Version 字段,Hibernate 将使用主键的值。

    【讨论】:

    • 有趣的答案。 @Version 对此有何帮助?
    • @Version 字段由 JPA 设置:每次在数据库中插入/更新实体时,它都会递增。因此,如果它为 null(或 0),则表示该实体从未插入过。如果不是,则表示已保存。
    • 啊。谢谢。好点子。好吧。你说的对。 POJO 是 POJO。尽管如此,我们不是在谈论 POJO,而是在谈论带注释的 JPA 实体。正如我已经说过的,主键不是一个好方法。
    • 并且带注释的 JPA 实体是 POJO。当您构造new Car(someId) 时,JPA 绝对无法知道汽车是否存在于数据库中。它所知道的是,由于 ID 应该是自动生成的,如果 someId 不为空,那么该实体已在不久前插入到数据库中,但如果它已被删除,它很可能不再存在.
    • 感谢您的讨论。基于 JPA,没有合适的方法来找出这一点。对于可以依赖@Version 或@Id 的情况,有一些解决方法。因此,唯一合适的解决方案是让所有 JPA 实体扩展一个(抽象)基类,其中包含一个字段“boolean isNew = false;”并在导入或任何 GUI 前端活动期间实例化实体时将此设置为 true。
    【解决方案2】:

    要知道Entity 实例当前是否由给定的EntityManager 实例管理,你有myEntityManager.contains(myEntity) 方法,它可能对你有用,即使我认为大多数实现都是基于主键的状态(JB Nizet 完全正确)。

    请注意,return false 并不断言实体不存在于数据库中。这只是检查实体是否被管理,它可能来自数据库并被另一个EntityManager 实例分离或检索。

    【讨论】:

      猜你喜欢
      • 2011-04-21
      • 2013-12-24
      • 2021-10-27
      • 1970-01-01
      • 2021-06-28
      • 2016-03-01
      • 2014-02-09
      • 2015-06-07
      • 2019-04-27
      相关资源
      最近更新 更多