繁体   English   中英

在Hibernate中从持久性上下文中分离实体中的实体

[英]Detach entity within entity from persistence context in Hibernate

Hibernate会在事务方法中保留修改后的实体,我可以通过使用session#evict(entity)来避免。

如果我将其与持久性上下文分离,那么其中的实体也将被分离?

例如,我有以下课程:

@Entity
public class User extends BaseEntity{
      @Column(name = "email")
      private String email;

      @OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
      private List<Address> addresses;

      // getters and setters
}

@Entity
public class Address extends BaseEntity{
      @Column(name = "email")
      private String email;

      @ManyToOne(fetch = FetchType.LAZY)
      @JoinColumn(name = "USER_ID")
      private User user;     

      // getters and setters
}

如果我分离了一个用户对象,但更改了其中的地址对象,该地址在交易结束时是否会保留? 像这样:

User user = userDAO.getById(id);
session.evict(user);
Address address = user.getAddresses().get(0);
address.setNumber(number);
addressDAO.saveOrUpdate(address); //will this work?

使用EntityManager.createQuery()更新或删除的实体不会加载到持久性上下文中,这仅适用于选择查询以及使用find()merge()

在执行更新或删除查询之后,您的持久性上下文实际上可能与数据库不同步,因为查询不会更新已经加载到持久性上下文中的实体(您需要调用refresh()来查看更改)。

如果您将多个用户(加载到持久性上下文中),然后在Update User set status='active' where id IN (:ids) ,则您尚未在持久性上下文中修改任何用户。修改了数据库。 要修改用户,您必须通过调用`aUser.setStatus('active')来修改实际的受管实体,当事务提交时,JPA将对照加载时创建的副本检查所有受管实体,如果有任何更改,将进行更新。

如果要将5000个对象加载到Persistence中,则JPA可能需要一些时间才能通过实体图运行,并在事务提交时检测到更改。 如果您未进行任何修改,并且想加快更改检测的速度,则有两种方法可以执行此操作。 使用只读查询加载您的实体,这告诉JPA它不需要保留已加载实体的副本。 另一个选择是调用EntityManager.clear()丢弃所有托管实体。 但是,如果您对性能感兴趣,最好的解决方案可能是避免将实体加载到持久性上下文中。 据我了解,您需要做一个Update User set ... where id IN (:ids) ,为此,您只需要用户的ID,因此您无需加载用户,只需要ID,因此,您可以执行List<Long> ids = em.createQuery("select u.id from User u where ...", Long.class).getResultList();

希望这可以为您澄清事情:)

编辑:这是从JPA角度编写的,但是对于休眠EntityManager只是直接转发给SessionImpl ,因此行为与所描述的完全相同,除了在本地Hibernate中将find()称为get()

从JPA 2.0开始

给定一个EntityManager,您可以使用要分离的实体作为参数调用detach

void detach(Object entity)

这里更多

如果使用注入,则可以在要分离所需实体的服务中注入EntityManger。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM