【发布时间】:2015-11-07 18:21:25
【问题描述】:
在 JPA 中:
是 ID set 的 Entity 类的实例,即使它刚刚被创建,也被视为 detached?
或类似:
是 ID 为 not set 的 Entity 类的实例,始终被视为 transient ?
我问这个是因为 jpa 方法在这两种情况下通常有不同的行为。
【问题讨论】:
在 JPA 中:
是 ID set 的 Entity 类的实例,即使它刚刚被创建,也被视为 detached?
或类似:
是 ID 为 not set 的 Entity 类的实例,始终被视为 transient ?
我问这个是因为 jpa 方法在这两种情况下通常有不同的行为。
【问题讨论】:
transient 和detached 状态之间的区别不是由实体本身决定的。给定一个实体实例,并不总是可以 100% 确定它是暂时的还是分离的。区别只是逻辑上的——实体实例在之前附加到持久性上下文时根据定义被分离。这也意味着在后备数据库中有相应的记录。
另一方面,第二个问题的答案是是 - 没有 ID 的实体尚未被持久化(附加),因此它必须仍然是暂时的。这是唯一可以确定状态的情况。由于分离实体对应于数据库中的记录,并且由于 id 对于 JPA 中的持久实体是强制性的,因此分离实体 必须 具有 id(在您的代码中分配或由 JPA 提供者自动分配)。
以下是对实体生命周期状态和在状态之间进行转换的有效操作的详尽说明:Entity lifecycle management
尽管实体仅在以前的attached 时才被认为是detached,但可以创建一个假的分离实体而之前没有附加。但这主要是一种 hack,并且不受规范的支持。大多数情况下,设置一个正确的id 就足够了。但是,如果您还使用@Version 列进行乐观锁定,则还必须为此列设置正确的值。如果您使用 JPA 提供程序的其他非标准机制,您仍然可能会遇到一些麻烦。
【讨论】: