JPA :
是一个实体类的实例,其ID 设置被认为是已分离,即使它刚刚被创建了吗?
或类似地:
是ID 未设置的实体类的实例始终被视为瞬态?
我问这个因为jpa方法经常在两种情况下有不同的行为。
答案 0 :(得分:3)
detached
和detached
状态之间的差异不是由实体本身决定的。给定实体的实例,如果它是瞬态的或分离的,并不总是100%确定。区别仅在于逻辑 - 实体实例在以前附加到持久性上下文时按定义分离。它还意味着后备数据库中有相应的记录。
另一方面,回答第二个问题是 - 没有ID的实体尚未保留(附加),因此它必须仍然是暂时的。这是唯一可以确定状态的情况。由于分离的实体对应于数据库中的记录,并且因为id对于JPA中的持久化实体是必需的,所以分离的实体必须具有id(在代码中分配或由JPA提供者自动分配)。
以下是对实体生命周期状态和有效操作的详尽说明,这些操作可在状态之间进行转换:Entity lifecycle management
尽管实体仅在以前attached
时被视为id
,但可以创建假的分离实体,而不必在之前附加。但这主要是一个黑客攻击,并没有得到规范的支持。在大多数情况下,设置正确的@Version
就足够了。但是,如果还使用{{1}}列进行乐观锁定,则还必须为此列设置正确的值。如果你使用JPA提供商的其他非标准机制,你可能会遇到麻烦。