Hibernate中操作managed/persistent状态的Entity对象使之成为detached状态的Entity对象

Hibernate中处于managed/persistent状态的Entity对象,通过持久化上下文(如Session或EntityManager)能够自动关联到数据库中的对象。这样,在Hibernate应用中对managed/persistent状态的Entity对象的操作将会同步到数据库中。

但是,当需要批量修改大量Entity对象时,这种对各个Entity对象的自动同步将会造成数据库性能压力。为此,可以使managed/persistent状态的Entity对象转变为detached状态的Entity对象,从而避免自动同步。这样,在Hibernate应用需要的时候再明确调用saveOrUpdate()或update()方法实现数据的再次同步。

使managed/persistent状态的Entity对象转变为detached状态的Entity对象,可以对Entity对象执行evict()操作(对于Session)或detach()操作(对于EntityManager),示例如下。

对于Hibernate的Native API,示例如下:

Session session = entityManager.unwrap( Session.class );
for(Person person : (List) session.createQuery("select p from Person p").list()) {
    dtos.add(toDTO(person));
    session.evict( person );
}

对于Hibernate的JPA API,示例如下:

for(Person person : entityManager.createQuery("select p from Person p", Person.class)
        .getResultList()) {
    dtos.add(toDTO(person));
    entityManager.detach( person );
}

如果要将持久化上下文(如Session或EntityManager)中的所有Entity对象都转换为detached状态,则还可以对 Session或EntityManager执行clear()操作。

对于Hibernate的Native API,示例如下:

session.clear();

对于Hibernate的JPA API,示例如下:

entityManager.clear();

你可能感兴趣的:(Hibernate中操作managed/persistent状态的Entity对象使之成为detached状态的Entity对象)