如何在使用新生成的实体标识符时深度复制休眠实体

2022-09-01 05:03:18

我使用的是关系数据库,使用单列pk和几个嵌套表。

我需要向我的项目添加一个简单的存档。存档仅在应用程序达到特定状态时发生,因此我希望做的是将现有的休眠对象复制到一个新实例中,在该实例中,新实例将使用新 ID 保存,同时保持现有对象不变。

我似乎无法弄清楚如何将现有对象复制到新实例中,而无需手动设置每个新实例字段。

有谁知道一个简单的方法来做到这一点?


答案 1

只需检索对象,将其分离,将 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


答案 2

我也在与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;
        }
    }

或者你可以去一个基于反射的解决方案,但我不建议这样做。查看此网站了解更多详情。


推荐