为什么Hibernate的EntityManager.find()impl抛出EntityNotFoundException?

时间:2012-03-09 19:02:04

标签: hibernate jpa

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)

1 个答案:

答案 0 :(得分:4)

我在使用Hibernate 4.1.x时遇到了同样的问题,并希望提供指向遇到同样问题的人的指针。就我而言,如前面的评论所述,它不是实体本身,而是从加载的实体引用的另一个实体。奇怪的是,这个被引用的实体确实存在,但它是在不同的事务/会话中访问的,并且产生了不同。由于我使用spring编写测试,因此将@transactional从类级别移动到方法的简单更改打破了整个过程。