2013-07-13 7 views
11

Ich frage mich, wie kann ich eine tiefe Kopie eines persistenten Objekts mit all seiner Zuordnung erstellen. Lassen Sie mich sagen, ich habe das folgende Modell.Deep Klon von Hibernate-Entität

class Document { 
    String title; 
    String content; 
    Person owner; 
    Set<Citation> citations; 
} 

class Person { 
    String name; 
    Set<Document> documents; 
} 

class Citation { 
    String title; 
    Date date; 
    Set<Document> documents; 
} 

Ich habe ein Szenario, in dem ein Benutzer wünschen könnte eine Kopie eines bestimmten Dokument von einer Person zu packen und machen das Dokument sein/sie dann später er/sie seinen Inhalt und den Namen ändern kann. In diesem Fall kann ich mir eine Möglichkeit vorstellen, ein solches Szenario zu implementieren, das eine tiefe Kopie dieses Dokuments erstellt (mit seinen Assoziationen).

Oder vielleicht, wenn jemand weiß, eine andere Möglichkeit, so etwas zu tun, ohne große Kopie von Daten, weil ich weiß, dass es für die Leistung der App schlecht sein kann.

Ich dachte auch über möglicherweise eine Referenz des Originaldokuments wie ein Attribut originalDocument erstellen, aber auf diese Weise werde ich nicht in der Lage zu wissen, welches Attribut (oder vielleicht Assoziation) wurde geändert.

Antwort

7

Um eine tiefe Kopie auszuführen:

public static <T> T clone(Class<T> clazz, T dtls) { 
     T clonedObject = (T) SerializationHelper.clone((Serializable) dtls); 
     return clonedObject; 
    } 

Dieses Dienstprogramm Methode eine tiefe Kopie des Unternehmens geben wird, und Sie können Ihre gewünschten Dinge ausführen, was Sie mit dem geklonten Objekt machen wollen.

+2

Das Problem bei dieser sein könnte, kann es nicht Behandeln Sie die Lazy Load-Auflistungen und die Versionseigenschaften. Meiner Meinung nach wäre der bessere Weg, die Deep-Copy-Methoden in jeder Klasse selbst zu schreiben. –

+0

kann nicht mit lazy-Feldern umgehen, da die faule Sammlung im neuen geklonten Objekt nicht initialisiert werden konnte. –

+0

Sie können Jackson verwenden, um in json serialisieren in mermory behandelt es Hibernate Lazy Loading (Sie müssen es konfigurieren) –

1

Jackon Serialisierung Konfiguration für Hibernate:

ObjectMapper mapperInstance 
    Hibernate4Module module = new Hibernate4Module(); 
     module.configure(Hibernate4Module.Feature.FORCE_LAZY_LOADING, false); 

     mapperInstance.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); 
     mapperInstance.disable(MapperFeature.USE_GETTERS_AS_SETTERS); 
     mapperInstance.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
     mapperInstance.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); 

     mapperInstance.registerModule(module); 

Und nächstes

clone = getMapperInstance().readValue(getMapperInstance().writeValueAsString(this)); 

Ok es etwas Speicher und CPU-Kosten ...