jpa:分离与瞬态定义

时间:2015-11-07 18:21:26

标签: java hibernate jpa

JPA
是一个实体类的实例,其ID 设置被认为是已分离,即使它刚刚被创建了吗?

或类似地:

是ID 未设置的实体类的实例始终被视为瞬态

我问这个因为jpa方法经常在两种情况下有不同的行为。

1 个答案:

答案 0 :(得分:3)

detacheddetached状态之间的差异不是由实体本身决定的。给定实体的实例,如果它是瞬态的或分离的,并不总是100%确定。区别仅在于逻辑 - 实体实例在以前附加到持久性上下文时按定义分离。它还意味着后备数据库中有相应的记录。

另一方面,回答第二个问题 - 没有ID的实体尚未保留(附加),因此它必须仍然是暂时的。这是唯一可以确定状态的情况。由于分离的实体对应于数据库中的记录,并且因为id对于JPA中的持久化实体是必需的,所以分离的实体必须具有id(在代码中分配或由JPA提供者自动分配)。

以下是对实体生命周期状态和有效操作的详尽说明,这些操作可在状态之间进行转换:Entity lifecycle management

尽管实体仅在以前attached时被视为id,但可以创建假的分离实体,而不必在之前附加。但这主要是一个黑客攻击,并没有得到规范的支持。在大多数情况下,设置正确的@Version就足够了。但是,如果还使用{{1}}列进行乐观锁定,则还必须为此列设置正确的值。如果你使用JPA提供商的其他非标准机制,你可能会遇到麻烦。