Hibernate延迟加载需要EJB事务吗?

时间:2011-06-29 08:48:41

标签: hibernate transactions lazy-loading ejb-3.1

当尝试使用hibernate优化我的java ee 6项目上的事务时,我尝试按照Eclipselink的方式进行操作,并关闭了只读查询的事务,如下所示:

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public User fetchUser(Integer id){
    User u = em.find(User.class, id);
    u.getRoleList().size();
    return u;
}

在hibernate中,这会在尝试读取用户角色时抛出异常,声称会话已经关闭。 Hibernate延迟加载是否真的需要一个完整的缩放EJB事务来读取数据?

1 个答案:

答案 0 :(得分:2)

简而言之,是的。

无论如何,进行交易是一个好主意,因为

  • 它保证两个请求(em.find的一个请求和延迟加载的请求)看到处于相同状态的数据库:第二个读取不会在第一个读取之后看到提交的内容,例如
  • 它使会话在事务发生时生效,从而优化了加载,因为它可以重用会话中缓存的对象,避免多次加载同一个实体等等。