【问题标题】:LazyInitializationException when using threads使用线程时出现 LazyInitializationException
【发布时间】:2013-07-19 08:41:01
【问题描述】:

尝试从数据库中获取某些对象时,我不断收到错误消息:

org.hibernate.LazyInitializationException (LazyInitializationException.java:19)     - could not initialize proxy - no Session

但我只在使用线程时得到错误。我们的应用结构方法调用流程如下:

FacadeImpl.saveRV() -->

@Transactional
@ParallelContext
BusinessImpl.validateEntry() -->

BusinessImpl.getOpMap() -->

@ParallelTask
DAOImpl.getMEFilter()

我在尝试访问已获取实体的字段时收到 LazyInitializationException,定义为:

// bi-directional many-to-one association to PtoConex
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "IDN_PTO_CONEX", insertable = false, updatable = false)
private PtoConex progTptoConex;

但是,如果我从BusinessImpl.validateEntry()@ParallelTask 的声明中删除@ParallelContext 注释,从DAOImpl.getMEFilter() 中删除,我没有任何问题。

【问题讨论】:

    标签: java multithreading hibernate concurrency


    【解决方案1】:

    Hibernate 会话和从该会话加载的实体不是线程安全的。如果您尝试从不同的线程访问它们,您将遇到这种“奇怪”的异常。

    在大多数情况下,将事务与并发混合也是一个坏主意。

    【讨论】:

    • +1。此外,即使它们是线程安全的,由业务服务启动的事务和关联会话在并行线程尝试延迟加载关联时已经关闭。
    • 但这不是我的决定。另外,我不认为我正在从不同的线程访问实体。
    • 我不确定你在做什么(我不知道@ParallelContext@ParallelTask),你能详细说明一下吗?
    • 所以,只是出于好奇,因为我无法改变这一点。 Hibernate + Threads 的替代方案是什么?
    • 您能否更详细地解释您要做什么?为什么首先需要并发?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多