2009-10-09 6 views
0
customer = // get customer from the current hibernate session 
// customer has a discount with database id of 1 

Tout va bien jusqu'à ici. Mais si je l'appelle:Hibernate Immutable Valeur Objet

discount = SpecialDiscount.create("10%"); 
customer.setDiscountTo(discount); 

session.save(customer); 
// customer has a discount with database id of 2 now 

Comment veille prolongée peut mettre à jour la même ligne avec réduction id de 2 même je l'ai établi à un autre objet de valeur de réduction? En outre, je veux empêcher les erreurs "un objet avec la même identité existe déjà" en détachant la précédente. Que suggérez-vous?

// An entity 
class Customer { 
    // one-to-one mapped immutable value object 
    SpecialDiscount discount; 

    SpecialDiscount discount() { 
     return SpecialDiscount.create(this.discount); 
    } 

    void setDiscountTo(SpecialDiscount discount) { 
     this.discount = SpecialDiscount.create(discount); 
    } 
} 
+0

Quand êtes-vous « un objet avec la même identité existe déjà » erreur? – Mark

Répondre

0

Pour stocker un objet de valeur immuable avec un mappage un à un, vous devriez idéalement utiliser un composant connu sous le nom d'objets incorporés en termes d'hibernation. Plus de détails peuvent être trouvés here.

ont également un regard sur les @Immutable annotation

Postez vos applications et vous devriez obtenir plus de réponses :)

0

Vous avez pas posté vos correspondances qui ne permet pas de diagnostiquer le problème avec précision et vos méthodes accesseurs semble assez étrange (pourquoi êtes-vous tout envelopper par SpeciaalDiscount.create()? Vous faites même deux fois sur le plateau en utilisant par exemple vous avez posté). Cela dit, si vous avez effectivement mappé le client à la réduction en tête-à-tête (comme vous l'avez dit dans le commentaire), Hibernate se comporte comme il se doit (mise à jour de l'enregistrement «discount» existant). Peut-être que vous devriez utiliser plusieurs-à-un à la place (encore une fois, difficile à dire à coup sûr sans comprendre ce que vous essayez de faire).

0

Il y a probablement quelque chose qui se passe avec la colonne id qui s'incrémente automatiquement à la fois via Hibernate et via la base de données. Publiez votre correspondance et vérifiez les propriétés de la colonne dans la base de données. Cela aiderait tout le monde à diagnostiquer le problème.

Une autre chose. (Je ne connais que NHibernate, donc cela peut ne pas s'appliquer.) Pour effectuer une mise à jour de ligne, vous devez généralement appeler Update() ou SaveOrUpdate() au lieu de Save(). L'appel à Save() a-t-il modifié l'enregistrement existant ou en a-t-il créé un nouveau dans la base de données avec id = 2?