【问题标题】:Hibernate lazy loading requires EJB transaction?Hibernate 延迟加载需要 EJB 事务吗?
【发布时间】:2011-09-24 23:12:58
【问题描述】:

在尝试使用 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 延迟加载真的需要一个完整的 EJB 事务来读取数据吗?

【问题讨论】:

    标签: hibernate transactions lazy-loading ejb-3.1


    【解决方案1】:

    简而言之,是的。

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

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

    【讨论】:

    • 我不同意。我认为不进行持久更新的方法不应该是事务性的。 Hibernate 最终应该负责在后台启动和回滚 JDBC 事务。这就是 eclipselink 的工作原理。
    猜你喜欢
    • 2011-02-27
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2018-11-22
    相关资源
    最近更新 更多