2010-08-06 22 views
1

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

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?

Répondre

0

Je crois que saveOrUpdate fait exactement ce que vous voulez. Mais son comportement dépend également de votre cartographie.

Si vous faites saveOrUpdate, cela vous donne-t-il les résultats que vous attendez?


Un peu hors sujet ici: connaissez-vous la requête par l'exemple? http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html#querycriteria-examples


Peu importe. Je vois juste que cette question a deux ans. Stupide «questions connexes» - option de stackoverflow.

+0

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. –

+0

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! –