从 3.6 更新到 Hibernate 5.1 产生传递给驱逐异常的非实体对象实例

Updating to Hibernate 5.1 from 3.6 produce Non-entity object instance passed to evict exception

我正在使用一个休眠 3.6 项目,该项目使用注释进行映射,现在我将其迁移到休眠 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。 如果不清楚,我可以提供更多细节

异常 "Non-entity object instance passed to evict" 被 hibernate 忽略,直到版本 4.2,现在抛出:

java.lang.IllegalArgumentException: Non-entity object instance passed to evict.

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

从 4.2 版开始,添加了 else 部分,如我们在 DefaultEvictEventListener.java#L99-L115 中所见。

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

然而,即使我认为这不是一个完美的解决方案,我更喜欢省略导致异常的逐出调用,因为我认为它可以在缓存中。

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

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