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

时间:2014-01-22 07:54:18

标签: hibernate jpa-2.0

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

Class A {
  Set<B>
  Set<C>
  Set<D>
}
Class B{
  Set<P>
}
Class P {
  Set<X>
}

现在我的要求是创建重复的对象。

由于我们不想触及现有实体,因此我们需要创建完整的对象。

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

感谢。

2 个答案:

答案 0 :(得分:0)

不确定我是否遇到了问题。为什么不在Java中创建一个新实例并像这样持久化(假设您已经创建或注入了一个实体管理器):

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

答案 1 :(得分:0)

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

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异常。因此,在实体上使用适当的注释来解决这个问题。