2013-07-13 4 views
11

Je me demande comment je peux créer une copie profonde d'un objet persistant avec toute son association. Disons que j'ai le modèle suivant.Clone profond de l'entité Hibernate

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; 
} 

J'ai un scénario dans lequel un utilisateur pourrait vouloir récupérer une copie d'un document particulier d'une personne et que le document son/le sien, puis plus tard, il/elle peut changer son contenu et son nom. Dans ce cas je peux penser à une façon d'implémenter ce genre de scénario qui est de créer une copie profonde de ce document (avec ses associations).

Ou peut-être si quelqu'un sait d'une autre façon possible de faire une telle chose sans faire une énorme copie de données, car je sais que ce peut être mauvais pour les performances de l'application. Je pensais aussi à créer une référence au document original comme ayant un attribut originalDocument mais de cette façon je ne serai pas capable de savoir quel attribut (ou peut-être l'association) a été changé.

Répondre

7

Pour effectuer une copie complète:

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

Cette méthode utilitaire donnera une copie en profondeur de l'entité, et vous pouvez effectuer vos choses souhaitées ce que vous voulez faire avec l'objet cloné.

+2

Le problème avec celui-ci pourrait être, il ne peut gérer les collections de chargement paresseux et les propriétés de la version. À mon humble avis le meilleur moyen serait d'écrire les méthodes de copie en profondeur dans chaque classe nous-mêmes. –

+0

ne peut pas gérer les champs paresseux, l'échec de l'initialisation de la collecte paresseuse dans le nouvel objet cloné échoue. –

+0

Vous pouvez utiliser Jackson pour sérialiser en json dans mermory il gère le chargement paresseux d'hibernate (vous devez le configurer) –

1

configuration sérialisation Jackon pour mise en veille prolongée:

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); 

Et à côté

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

Ok le coût de la mémoire et cpu ...