Java jpa:分离与瞬态定义
在JPA中:Java jpa:分离与瞬态定义,java,hibernate,jpa,Java,Hibernate,Jpa,在JPA中: ID为set的实体类的实例是否被视为已分离的(即使它是刚刚创建的) 或类似地: ID为未设置的实体类实例是否始终被视为是暂时的 我问这个问题是因为jpa方法在这两种情况下通常有不同的行为。瞬态和分离状态之间的差异不是由实体本身决定的。给定一个实体实例,并不总是能够100%确定它是暂时的还是分离的。区别在于,只有逻辑实体实例在以前附加到持久性上下文时,才根据定义分离。这也意味着备份数据库中有相应的记录 另一方面,第二个问题的答案是是-没有ID的实体尚未被持久化(附加),因此它必须仍然
ID为set的实体类的实例是否被视为已分离的(即使它是刚刚创建的) 或类似地: ID为未设置的实体类实例是否始终被视为是暂时的
我问这个问题是因为jpa方法在这两种情况下通常有不同的行为。瞬态和分离状态之间的差异不是由实体本身决定的。给定一个实体实例,并不总是能够100%确定它是暂时的还是分离的。区别在于,只有逻辑实体实例在以前附加到持久性上下文时,才根据定义分离。这也意味着备份数据库中有相应的记录 另一方面,第二个问题的答案是是-没有ID的实体尚未被持久化(附加),因此它必须仍然是暂时的。这是唯一的情况,当你可以确定的状态。由于分离的实体对应于数据库中的一条记录,并且由于id对于JPA中的持久化实体是必需的,所以分离的实体必须具有id(在代码中分配或由JPA提供商自动分配) 以下是实体生命周期状态和在状态之间进行转换的有效操作的详细说明:
尽管实体只有在以前附加的情况下才被视为是分离的,但可以创建一个假分离实体而不附加。但这主要是一种黑客行为,规范不支持。在大多数情况下,设置正确的
id
就足够了。但是,如果还使用@Version
列进行乐观锁定,则还必须为此列设置正确的值。如果您使用JPA提供程序的其他非标准机制,您可能会遇到一些麻烦。当您使用虚拟列时,也会出现一种特殊情况:在DB级别“计算”一个值:因此JPA将获取该值,但瞬态对象不会填充该字段