【问题标题】:EntityManager.contains() returns false after persist()EntityManager.contains() 在 persist() 之后返回 false
【发布时间】:2012-01-21 16:57:52
【问题描述】:

EntityManager.persist() 的文档说它将是Make an instance managed and persistent

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

我只想知道为什么会这样?也许有什么我做不到或忽略了什么?

建议将不胜感激:D

【问题讨论】:

  • 你能发布你的代码,你坚持并读取EntityManager的内容吗?

标签: java jpa persistence jta entitymanager


【解决方案1】:

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

contains()方法可以用来判断一个实体是否 实例在当前持久化上下文中进行管理。

contains 方法返回 true:

  • 如果实体已从数据库中检索,并且尚未删除或分离。
  • 如果实体实例是新的,并且已在实体上调用了persist 方法或已将持久操作级联到它。

contains 方法返回 false:

  • 如果实例已分离。
  • 如果在实体上调用了remove 方法,或者已级联删除操作。
  • 如果实例是新的,并且没有在实体上调用persist方法或者没有级联持久化操作 它。

注意,persist 或 remove 的级联效果是 对 contains 方法立即可见,而实际 插入或删除实体的数据库表示 可以推迟到交易结束。

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

【讨论】:

  • 我确实相信我在同一个事务中,但我不太确定,因为我没有定义事务应该从哪里开始和提交,因为我把它留给了容器。但我认为为什么我没有得到持久化实体是因为主键。主键之一应该来自数据库,我无法检索它。无论如何,我会尝试一种不同的方法来完成这项工作。感谢您提供的信息:D
【解决方案2】:

我们做了一些解决方法,而不是持久化 > 刷新,我们只是从数据存储中获取自动生成的键并将其手动分配给实体的键字段,然后将其持久化。

【讨论】:

    猜你喜欢
    • 2016-07-14
    • 2012-04-01
    • 2013-06-30
    • 2018-08-13
    • 1970-01-01
    • 2017-10-01
    • 2013-03-10
    • 2021-07-23
    • 2018-03-16
    相关资源
    最近更新 更多