2011-12-16 55 views
5

EntityManager.persist()的文件表示,将。EntityManager.contains()后,坚持返回false()

它将实体持久化到数据库,但是当我调用EntityManager.contains()方法来检查我刚刚持久化的实体是否被管理时,它将返回false

我只想知道为什么会发生这种情况?也许有些东西是我无法做到的,或者是我忽视的东西?

建议将不胜感激:D

+1

你可以发布你的代码,你坚持和读取EntityManager的内容? – 2011-12-16 11:44:03

回答

3

这真的很奇怪。根据该Sun EJB3 spec

的方法可以被用来确定在当前的持久性上下文的实体 实例是否进行管理。

contains方法返回true:

  • 如果实体已被从数据库中检索,并没有被移除或分离。
  • 如果实体实例是新的,而persist方法被调用的实体或持续操作已经级联到它。

contains方法返回false:

  • 如果实例分离。
  • 如果在实体上调用了remove方法,或者删除操作已与级联。
  • 如果实例是新的,而persist方法还没有被调用的实体或持续操作尚未级联 它。

注意的持续级联的效应或删除是 立即可见的含有方法,而实际 插入或缺失针对该实体 数据库表示的可被推迟,直到该事务的结束。

您是否在同一个事务中调用contains

+0

我确实相信我处于同一事务中,但我并不确定,因为我没有定义事务应该开始和提交的位置,因为我将它留给了容器。但我想为什么我没有得到持久实体是因为主键。主键之一应该来自数据库,我无法检索。无论如何,我只是尝试一种不同的方法来完成这件事。谢谢你的信息,但:D – 2011-12-16 06:14:53

0

我们做了一些解决方法,而不是持续>刷新,我们只是把从数据库中自动生成的密钥并手动将其指定为实体的键字段,然后坚持它。