Je stocke un objet immuable relativement complexe dans une base de données. Il y a beaucoup d'associations plusieurs-à-un - l'objet a des propriétés qui ont des propriétés et ainsi de suite.Conserver uniquement des valeurs distinctes dans les tables utilisant Hibernate
Je souhaite que chaque objet ne soit stocké qu'une seule fois, sur la base d'une clé métier qui est dans ce cas chaque propriété unique de l'objet.
Le workflow est comme ceci:
utilisateur- crée un objet complexe. Cela peut prendre beaucoup de temps, le code est dispersé partout.
- J'Interrogation de la base de données, pour voir si le même objet exact a déjà été réalisé:
- sinon,
save
- si oui, réglez id et
merge
- sinon,
de l'objet Le problème est que le merge
de Hibernate a une sémantique plutôt incommode:
transientObject = createComplexTransientObject();
mergedObject = session.merge(transientObject);
// here you have to discard transientObject
// use mergedObject from now on
L'objet qui a été créé doit être rejeté et remplacé par celui fourni par Hibernate, ce qui signifie que je dois mettre à jour toutes les références à celui-ci.
J'ai besoin d'un moyen de dire à hibernate: "Ce nouvel objet transientObject semble être identique à celui qui est déjà dans la base de données. En d'autres termes:
object = createComplexTransientObject();
session.inPlaceMerge(object);
// object is now persistent
Comment puis-je y parvenir?
Oui, je connais Query By Example. Je pense que QBE créerait un autre objet basé sur ma requête, donc j'ai mon objet original et un résultat de la requête ... Je voudrais avoir l'objet original seul. –
Je dois enquêter sur saveOrUpdate. Peut-être que si ma cartographie est assez intelligente pour déclarer la clé de l'entreprise comme tous les champs de l'objet, quand j'exécuterai une sauvegarde, on lui assignera un identifiant en place ... J'ai besoin d'essayer ça! –