为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

牛魔王的故事 2023-08-09 16:04:05
我正在使用一个 hibernate 3.6 项目,该项目使用注释进行映射,现在我将其迁移到 hibernate 5.1,并且我遇到了这个运行时异常 Non-entity object instance pass to evict 下面是对 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 中,持久化器为 null。如果不清楚,我可以提供更多详细信息
查看完整描述

2 回答

?
MM们

TA贡献1886条经验 获得超2个赞

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

java.lang.IllegalArgumentException:传递给驱逐的非实体对象实例。

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

从版本 4.2 开始,添加了 else 部分,如我们在DefaultEvictEventListener.java#L99-L115中看到的那样。

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

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


查看完整回答
反对 回复 2023-08-09
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

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

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


查看完整回答
反对 回复 2023-08-09
  • 2 回答
  • 0 关注
  • 228 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信