如何在hibernate中使用现有实体创建新实体

如何在hibernate中使用现有实体创建新实体,hibernate,jpa-2.0,Hibernate,Jpa 2.0,例如,我们有一个非常嵌套的对象 Class A { Set<B> Set<C> Set<D> } Class B{ Set<P> } Class P { Set<X> } 现在我的要求是创建重复的对象 由于我们不想接触现有的实体,所以我们需要创建完整的对象 hibernate是否提供了创建完整对象的方法,而不是手动迭代每个对象并使Ids为空 谢谢。我不确定我是否了解你的问题。假设您已经创建或注入了entityman

例如,我们有一个非常嵌套的对象

Class A {
  Set<B>
  Set<C>
  Set<D>
}
Class B{
  Set<P>
}
Class P {
  Set<X>
}
现在我的要求是创建重复的对象

由于我们不想接触现有的实体,所以我们需要创建完整的对象

hibernate是否提供了创建完整对象的方法,而不是手动迭代每个对象并使Ids为空


谢谢。

我不确定我是否了解你的问题。假设您已经创建或注入了entitymanager,为什么不在Java中创建一个新实例并像这样保持它呢

@Inject EntityManager entityManager; 
....
A a = new A();
a.setFieldx(y);  // etc for all fields you want to set
....
entityManager.persist(a); 

回答一个老问题,因为它可能对仍然需要这种东西的人有所帮助。我们也有类似的要求,杰克逊前来救援。下面是一个简单的例子:

public class Test {

    static class A {
        String id;
        String text;
        B objectB;
        //Getters & Setters
    }

    static class B {
        String id;
        String text;
        //Getters & Setters
    }

    @JsonFilter("idFilter")
    class PropertyFilterMixIn {
    }

    public static void main(String args[]) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.addMixIn(
            Object.class, PropertyFilterMixIn.class);

        String[] ignorableFieldNames = { "id" };
        FilterProvider filters = new SimpleFilterProvider()
            .addFilter("idFilter",
                SimpleBeanPropertyFilter.serializeAllExcept(
                    ignorableFieldNames));
        ObjectWriter writer = mapper.writer(filters);

        final A a = new A();
        a.setId("10");
        a.setText("A-Obj");
        B b = new B();
        b.setText("B-Obj");
        b.setId("12");
        a.setObjectB(b);

        final String string = writer.writeValueAsString(a);
        final A readValue = mapper.readValue(string, A.class);
        System.out.println(readValue);
    }
}

需要考虑的一件事是,如果实体是双向的,那么在JSON编组/解编组中可能会导致stackoverflow异常。所以,在实体上使用适当的注释来解决这个问题。

如果我将实体id设置为null并将其持久化,它就可以了,但我不希望这样,因为它是一个非常复杂的对象。我想要一个更好的选择,但谢谢你给我时间。我不会像你那样操纵实体ID。你应该创建一个新的对象实例,然后如果你必须复制大量字段,你可以使用Apache BeanUtils->copyProperties。我使用dozer mapper进行字段映射,但是我们必须在列表子对象中复制父对象的引用。您知道,对于复杂的it对象来说,这是一项非常乏味的任务。