2014-01-22 76 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); 
    } 
} 

一件事。因此,在實體上使用適當的註釋來解決這個問題。