【问题标题】:Updating to Hibernate 5.1 from 3.6 produce Non-entity object instance passed to evict exception从 3.6 更新到 Hibernate 5.1 会产生传递给驱逐异常的非实体对象实例
【发布时间】:2020-01-20 18:47:39
【问题描述】:

我正在使用一个使用注解进行映射的 hibernate 3.6 项目,现在我将它迁移到 hibernate 5.1,并且我有这个运行时异常 非实体对象实例传递给 evict 下面是驱逐的调用

HibernateUtils.getSession().evict(origProject.getProbidinfo());
HibernateUtils.getSession().evict(origProject);

下面是引发异常的 DefaultEvictEventListener.class 的代码

EntityPersister persister = null;
                final String entityName = persistenceContext.getSession().guessEntityName( object );
                if ( entityName != null ) {
                    try {
                        persister = persistenceContext.getSession().getFactory().getEntityPersister( entityName );
                    }
                    catch (Exception ignore) {
                    }
                }
                if ( persister == null ) {
                    throw new IllegalArgumentException( "Non-entity object instance passed to evict : " + object );
                }


在我的 hibernate 5.1 中,persister 为 null。 如果不清楚,我可以提供更多详细信息

【问题讨论】:

    标签: java hibernate persistence evict hibernate-5


    【解决方案1】:

    在 4.2 版本之前,hibernate 忽略了异常“传递给 evict 的非实体对象实例”,现在抛出:

    java.lang.IllegalArgumentException:非实体对象实例传递给 evict。

    在 4.2 之前的休眠版本中,由于没有 DefaultEvictEventListener.java#L91-L94 的 else 部分,它被忽略了。

    从版本 4.2 开始,添加了 else 部分,我们可以在 DefaultEvictEventListener.java#L99-L115 看到。

    在我研究了这个错误之后,我在网上找到的唯一建议是我们捕获并忽略这个异常。

    但是,即使我认为这不是一个完美的解决方案,也可以省略 evict 调用,这会导致异常是我更喜欢的,因为我可以将它放在缓存中。

    【讨论】:

      【解决方案2】:

      Hibernate 检查您传递的对象是实体,因此它不想驱逐或分离任何对象(在我的情况下是 ArrayList)或除实体之外的 null。

      我更喜欢对解决方案进行空检查或类型检查,而不是捕获和忽略。

      【讨论】:

        猜你喜欢
        • 2013-05-10
        • 2022-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-09
        • 2012-01-25
        • 1970-01-01
        相关资源
        最近更新 更多