如何在使用新生成的实体标识符时深度复制休眠实体
2022-09-01 05:03:18
我使用的是关系数据库,使用单列pk和几个嵌套表。
我需要向我的项目添加一个简单的存档。存档仅在应用程序达到特定状态时发生,因此我希望做的是将现有的休眠对象复制到一个新实例中,在该实例中,新实例将使用新 ID 保存,同时保持现有对象不变。
我似乎无法弄清楚如何将现有对象复制到新实例中,而无需手动设置每个新实例字段。
有谁知道一个简单的方法来做到这一点?
我使用的是关系数据库,使用单列pk和几个嵌套表。
我需要向我的项目添加一个简单的存档。存档仅在应用程序达到特定状态时发生,因此我希望做的是将现有的休眠对象复制到一个新实例中,在该实例中,新实例将使用新 ID 保存,同时保持现有对象不变。
我似乎无法弄清楚如何将现有对象复制到新实例中,而无需手动设置每个新实例字段。
有谁知道一个简单的方法来做到这一点?
只需检索对象,将其分离,将 id 设置为 null 并保留它。
MyEntity clone = entityManager.find(MyEntity.class, ID);
entityManager.detach(clone);
clone.setId(null);
entityManager.persist(clone);
如果您的对象具有 oneToMany 关系,则必须对所有子对象重复该操作,但设置父对象 ID(在调用后生成)而不是 null。persist
当然,您必须删除 OneToMany 关系上的任何原因,否则您的持久性将在 DB 或 fk 约束失败中创建所有子级的副本。CASCADE persist
我也在与Hibernate合作,我得到了与你相同的要求。我遵循的是实现.下面是如何执行此操作的代码示例。Cloneable
class Person implements Cloneable {
private String firstName;
private String lastName;
public Object clone() {
Person obj = new Person();
obj.setFirstName(this.firstName);
obj.setLastName(this.lastName);
return obj;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
或者你可以去一个基于反射的解决方案,但我不建议这样做。查看此网站了解更多详情。