2014-01-22 44 views
1

创建使用现有实体的新的实体有例如我们如何在休眠

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

非常嵌套的对象现在,我的要求是创建重复的对象。

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

是否hibernate提供了任何方式来创建完整的对象,而不是手动迭代每个对象并使ID为空?

谢谢。

回答

0

不知道我得到你的问题。为什么不能在Java中创建一个新的实例,并坚持像这样(假设你已经创建或注入一个EntityManager):

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

如果我设置实体ID为null并坚持它会做,但我不想那样,因为它是非常非常复杂的对象。我想要一个更好的选择,但谢谢你给你的时间。 –

+0

我不会像你这样操纵实体ID。您应该创建对象的新实例,然后如果您必须复制大量字段,则可以使用Apache BeanUtils - > copyProperties。 –

+0

我正在使用dozer mapper进行字段映射,但是事件之后我们必须复制列表子对象中父对象的引用。你理解复杂的东西,它是一项非常繁琐的任务。 –

0

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

需要考虑的是,如果实体是双向的,那么它可以导致JSON编组/解组计算器例外
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); 
    } 
} 

一件事。因此,在实体上使用适当的注释来解决这个问题。