【问题标题】:lazyinitalizationexception with wildfly 14: could not initialize proxy - the owning session was closedwildfly 14 的延迟初始化异常:无法初始化代理 - 拥有会话已关闭
【发布时间】:2019-04-19 22:17:19
【问题描述】:

如果我使用 wildfly 14 服务器运行我的代码,我会得到以下异常。同样的代码适用于 wildfly 13。问题可能出在哪里?

Caused by: org.hibernate.LazyInitializationException: could not initialize proxy [ch.example.tool.entity.Benutzer#12] - the owning Session was closed
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:172)
    at org.hibernate.proxy.AbstractLazyInitializer.getIdentifier(AbstractLazyInitializer.java:89)
    at org.hibernate.internal.SessionImpl.getProxyIdentifier(SessionImpl.java:1752)
    at org.hibernate.internal.SessionImpl.getContextEntityIdentifier(SessionImpl.java:1743)
    at org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:271)
    at org.hibernate.type.EntityType.getIdentifier(EntityType.java:495)
    at org.hibernate.type.EntityType.nullSafeSet(EntityType.java:280)
    at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2868)
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3307)
    at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3229)
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3630)
    at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:146)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:478)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:356)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
    at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1454)
    ... 122 more

【问题讨论】:

    标签: spring hibernate wildfly jta transactional


    【解决方案1】:

    我必须为 Wildfly 14 中的合并操作显式加载惰性代理引用。就像这样它可以工作。

    Wildfly 13 及之前:

    @Transactional
    public class VergleichDAOImpl implements VergleichDAO {
    
        @PersistenceContext
        private EntityManager em;
    
    
        @Override
        public void save(Vergleich vergleich) {     
    
            if(vergleich.getId() == null) {
                em.persist(vergleich);
            } else {
                em.merge(vergleich);
            }
        }
    

    野蝇 14

    @Transactional
    public class VergleichDAOImpl implements VergleichDAO {
    
        @PersistenceContext
        private EntityManager em;
    
    
        @Override
        public void save(Vergleich vergleich) {     
    
            if(vergleich.getId() == null) {
                em.persist(vergleich);
            } else {
                Benutzer benutzer  = em.find(Benutzer.class, vergleich.getBenutzer().getId());
                vergleich.setBenutzer(benutzer);
                em.merge(vergleich);
            }
        }
    

    【讨论】:

    • 什么是关闭会话,在我的类似问题中是 Spring,你在使用 Spring。您提出的解决方案是一种解决方法,我认为需要解决原因的实际根源。我已经写信给 Hibernate,但他们认为这是一个 Spring 问题。也许这是一个Wildfly问题。你解决了吗,我也有同样的问题。您提供的解决方法对于成熟的企业项目来说是不合理的。我使用的是 Wildfly 15,是从 Wildfly 10 升级而来的,这是 Wildfly 中的错误吗?
    • 你说得对,我的解决方案只是一种解决方法。对不起,我没有调查更多时间来找出问题的根源。也许WF15中有错误修复?
    【解决方案2】:

    我还选择了一种解决方法,所有实体 @ManyToOne 都已使用 @NotAudited 注释,因此 Envers 不会在 entityManager 关闭后尝试加载它们。目前有效,似乎是一个 Hibernate 错误。

    【讨论】:

      【解决方案3】:

      来自this article,在您的配置中设置hibernate.jpa.compliance.proxy=false 可能是解决方案(因为Wildfly 可能将其设置为true)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-26
        • 1970-01-01
        • 2016-06-04
        • 2018-11-21
        • 2014-12-23
        • 2016-07-06
        • 2015-07-02
        相关资源
        最近更新 更多