JPA 2.0 javadoc(可能是规范)说EntityManager.find()在找不到实体时返回null:
找到的实体实例,如果实体不存在,则返回null
然而,Hibernate的impl会抛出EntityNotFoundException。为什么?使用Hibernate 3.6.8和hibernate-jpa-2.0-api v1.0.1.Final
观察javax.persistence.EntityNotFoundException:无法找到id为144487的bar.foo.Entity 在org.hibernate.ejb.Ejb3Configuration $ Ejb3EntityNotFoundDelegate.handleEntityNotFound(Ejb3Configuration.java:137) 在org.hibernate.event.def.DefaultLoadEventListener.returnNarrowedProxy(DefaultLoadEventListener.java:320) 在org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:277) 在org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:152) 在org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:1090) 在org.hibernate.impl.SessionImpl.get(SessionImpl.java:1005) 在org.hibernate.impl.SessionImpl.get(SessionImpl.java:998) 在org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:779) 在org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:754)
答案 0 :(得分:4)
我在使用Hibernate 4.1.x时遇到了同样的问题,并希望提供指向遇到同样问题的人的指针。就我而言,如前面的评论所述,它不是实体本身,而是从加载的实体引用的另一个实体。奇怪的是,这个被引用的实体确实存在,但它是在不同的事务/会话中访问的,并且产生了不同。由于我使用spring编写测试,因此将@transactional从类级别移动到方法的简单更改打破了整个过程。