【问题标题】:How do I distinguish a detached from a removed entity?如何区分分离的实体和已移除的实体?
【发布时间】:2014-05-09 20:32:55
【问题描述】:

正如 JPA 1 和 Hibernate 文档 2 中所述,已删除实体的状态定义如下:

已移除:已移除的实体实例是具有持久身份的实例,与持久性上下文相关联,但计划从数据库中移除。

据我了解,已移除的实体不再管理,这就是EntityManager#contains(Object) 在已移除对象上返回 false 的原因,尽管它们与持久性上下文相关联,并且方法被记录为:

检查实例是否为托管实体实例属于当前持久化上下文

也就是说,下面两个代码 sn-ps 会产生相同的结果:

// omitted transaction
em.remove(entity);
entity.getId(); // returns the entity id
entity.contains(entity); // false (?)

 

em.detach(entity);
entity.getId(); // returns the entity id
em.contains(entity); // false

那么我如何确定已删除实体与持久性上下文的关联?如何区分分离的实体和已移除的实体?

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    分离 - 实体具有关联标识符,但不再与持久性上下文相关联(通常是因为持久性上下文已关闭或实例已从上下文中逐出)

    removed - 实体具有关联标识符并与持久性上下文关联,但是它已计划从数据库中删除。

    一旦事务被刷新,它将被删除。

    【讨论】:

    • 这只是从手册中复制的,它没有回答我如何确定删除的实体是否与持久性上下文相关联的问题。
    【解决方案2】:

    如果您尝试获取或对分离实体执行某些操作,则会引发异常。
    另一方面,对于被移除的实体,它要么获取你,直到你的事务没有被刷新,要么返回 null,因为它也不会在数据库中。

    还有 load() 和 get() ,这里可以使用方法。

    session.load()
    

    它总是会返回一个“代理”(Hibernate 术语)而不访问数据库。在 Hibernate 中,proxy 是一个具有给定标识符值的对象,它的属性尚未初始化,它只是看起来像一个临时的假对象。
    如果未找到任何行,则会抛出 ObjectNotFoundException。

    session.get()
    

    它总是命中数据库并返回真实对象,一个代表数据库行的对象,而不是代理。
    如果没有找到行,则返回 null。

    【讨论】:

      【解决方案3】:

      而不是em.contains(entity) 调用em.getReference(Entity.class, id)。如果抛出 javax.persistence.EntityNotFoundException 则表示该实体已被删除。

      【讨论】:

        猜你喜欢
        • 2018-07-03
        • 1970-01-01
        • 2015-08-10
        • 1970-01-01
        • 2012-01-16
        • 1970-01-01
        • 1970-01-01
        • 2012-01-19
        • 1970-01-01
        相关资源
        最近更新 更多