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

问题描述 投票:0回答:1

我正在使用注释进行映射的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 );
                }


在我的情况下,在持久性5.1中,persister为null。如果不清楚,我可以提供更多详细信息

java hibernate persistence evict hibernate-5
1个回答
0
投票

在进入版本4.2之前,冬眠忽略了“传递给逐出的非实体对象实例”异常,该异常现在抛出:

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

在4.2之前的休眠版本中,由于没有https://github.com/hibernate/hibernate-orm/blob/4.1/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultEvictEventListener.java#L91-L94的else部分,因此被忽略了从4.2版开始,添加了else部分,如我们在https://github.com/hibernate/hibernate-orm/blob/4.2/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultEvictEventListener.java#L99-L115

中所见

研究此漏洞后,我在网上找到的唯一建议是我们捕获并忽略了此异常。

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

© www.soinside.com 2019 - 2024. All rights reserved.