2015-11-07 19 views
2

JPA
是ID 实体类的一个实例建立认为分离,即使是刚刚创建it'hasJPA:独立VS短暂定义

或类似:

是一个实体类的ID为一个实例没有设置始终认为短暂

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

回答

3

transientdetached状态之间的差异不是由实体本身决定的。给定一个实体的实例,并不总是可以100%确定它是暂时的还是分离的。区别仅在于逻辑 - 当实体实例先前附加到持久性上下文时,实体实例被定义分离。这也意味着在后台数据库中有相应的记录。

在另一方面,答案第二问题是 - 没有ID的实体还没有被持久化(附后),因此它必须是仍然短暂。这是唯一的情况,当你可以确定状态。由于分离的实体对应于数据库中的记录,并且因为id对于JPA中的持久实体是强制性的,所以分离实体必须有的id(分配给您的代码或由JPA提供程序自动分配)。

这里是实体生命周期的状态和有效的行动,这使得状态之间的转换的详尽的解释:尽管实体被认为detached只有当以前attached,就可以创建一个假分离的实体Entity lifecycle management

之前没有附加。但这主要是一种破解,并且不受规范支持。对于大多数情况下,设置正确的id就足够了。但是,如果您还使用@Version列进行乐观锁定,则还必须为该列设置正确的值。如果您使用JPA提供程序的其他非标准机制,则可能会发生这种情况,您仍然会遇到一些麻烦。