【问题标题】:Hibernate lazy loading in self-created objects在自创对象中休眠延迟加载
【发布时间】:2014-05-12 20:39:39
【问题描述】:

我在事务性 ejb 方法中的自创对象中的 Hibernate 延迟加载实体存在问题。

@Entity
public class SampleEntity {

    ...

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<AnotherEntity> list;

    ...

}

EJB:

@Stateless
public class SampleEjb {

    public void transactionalMethod() {
        SampleEntity entity = //select entity from db

        new SamplePojo().lazyLoad(entity);
    }

}

POJO:

public class SamplePojo {

    public void lazyLoad(SampleEntity entity) {
        //there sometimes i have receiving javax.persistence.TransactionRequiredException
        entity.getList().size();
    }    

}

有趣的是,这个问题有时会发生,有时不会。当我第一次在我的项目中遇到这种情况时,我通过将 SamplePojo 注入我的 EJB 来解决这个问题(当时认为 EJB 事务不会注入到自己创建的对象中)。但是现在我意识到我的项目中还有其他地方与我在这里发布的类似,并且注入了事务并且代码运行良好。

是否应该将事务范围包含在 EJB 方法中的用户创建对象中?我的带有实体延迟加载的代码是随机的吗? 有没有人遇到过这个问题?

【问题讨论】:

    标签: hibernate jakarta-ee transactions ejb lazy-loading


    【解决方案1】:

    事务不会注入到对象中。事务附加到当前线程(使用 ThreadLocal 变量)。一旦一个线程开始一个事务,在这个线程中运行的每一个代码都会在这个事务的上下文中执行,不管你可能使用什么对象,直到事务结束(或者一个新的开始)。

    旁注:您的 lazyLoad() 方法不会加载任何内容。您必须在 getList() 返回的惰性列表上调用一个方法来加载它。

    【讨论】:

    • 所以这表明我之前没有解决我的问题。很高兴了解 ThreadLocal 事务机制 - 感谢您的回答。 PS。抱歉,pojo 示例中的错误 - 我的脑子写得太快了;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多