Hibernate 为什么冬眠';s EntityManager.find()impl throw EntityNotFoundException?

Hibernate 为什么冬眠';s EntityManager.find()impl throw EntityNotFoundException?,hibernate,jpa,Hibernate,Jpa,JPA 2.0(可能还有规范)说EntityManager.find()在找不到实体时返回null: 找到的实体实例,如果实体不存在,则为null 然而Hibernate的impl却抛出EntityNotFoundException。为什么?使用Hibernate 3.6.8和 javax.persistence.EntityNotFoundException:找不到id为144487的bar.foo.Entity 在org.hibernate.ejb.Ejb3Configuration$Ejb

JPA 2.0(可能还有规范)说EntityManager.find()在找不到实体时返回null:

找到的实体实例,如果实体不存在,则为null

然而Hibernate的impl却抛出EntityNotFoundException。为什么?使用Hibernate 3.6.8和

javax.persistence.EntityNotFoundException:找不到id为144487的bar.foo.Entity 在org.hibernate.ejb.Ejb3Configuration$Ejb3EntityNotFoundDelegate.handleEntityNotFound(Ejb3Configuration.java:137) 位于org.hibernate.event.def.DefaultLoadEventListener.ReturnSlowedProxy(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)


我在使用Hibernate4.1.x时遇到了同样的问题,我想提供一个指向遇到同样问题的人的指针。在我的例子中,正如前面的评论中提到的,它不是实体本身,而是从加载的实体引用的另一个实体。奇怪的是,这个被引用的实体确实存在,但它是在不同的事务/会话中访问的,这造成了不同。因为我使用spring编写了一个测试,所以将@transactional从类级别移动到方法的简单更改打破了这一切。

堆栈跟踪提供了足够的信息——它们都是HB代码,您可以在maven repoNo中的hibernate-entitymanager-3.6.8-sources.jar中看到,它没有。例如,它不会告诉实体是否已经在会话中加载。它也没有说明要查找哪个实体类。但是如果你不想得到帮助,就不要提供任何信息。你是在尝试
find()
bar.foo.Entity
还是其他引用它的实体?@jb nize不够公平,我将压缩并发布一个测试用例。但是看看EntityManager.find()的javadoc,在任何情况下都不会说EntityNotFound是可以预期的(与get()不同),impl应该返回实体null或抛出非法状态异常。它不应该抛出EntityNotFound。或者你对合同有不同的理解吗?我认为你遇到了一个合同中没有描述的情况。例如:实体存在,但引用了一个不存在的实体。