Java 保存JPA实体两次

Java 保存JPA实体两次,java,jpa,clone,Java,Jpa,Clone,我正试图保存一个JPA实体两次,因为我想存储我的文章的父级和修订版 当我创建新文章时,我实际上想创建一个父项和一个版本,它是父项的副本。比如: Article parent = new Article(); Article revision = parent.clone(); em.persist(parent); em.persist(revision); 但实际情况是,我在第二次调用persist时遇到以下异常: org.hibernate.StaleStateException:

我正试图保存一个JPA实体两次,因为我想存储我的文章的父级和修订版

当我创建新文章时,我实际上想创建一个父项和一个版本,它是父项的副本。比如:

Article parent = new Article();
Article revision = parent.clone();

em.persist(parent);
em.persist(revision);
但实际情况是,我在第二次调用persist时遇到以下异常:

org.hibernate.StaleStateException: 
     Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

我如何克隆文章以避免出现此类异常?

您的克隆方法是否也复制了@Id(可能还有@Version)?你真的应该给你的副本一个新的ID(或者如果你使用@GeneratedValue,则使用未保存的值来生成一个新的值)。

你能展示一下你的
clone()
方法吗?也许您应该重写它,而不必为复制的对象指定初始对象的id。主键是自动生成的还是您正在生成并设置它。如果生成,则克隆可能已将id复制到修订版,这会导致问题。密钥是自动生成的。我确保它没有被复制。显然,“克隆”方法复制了一些HIbernate属性,这是不需要的。父级和修订版都有@GeneratedValue,因此对于这两个版本,值都是自动生成的。