天天看點

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<Person>) 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();
           

繼續閱讀