2010-03-24 3 views
1

J'essaie d'utiliser Hibernate pour incrémenter automatiquement l'ID, cependant, j'essaie d'éviter la duplication.éviter la duplication avec la clé d'incrémentation automatique dans Hibernate

class Service 
{ 
    Long id; // auto increment 
    String name; 
    String owner; 
    Boolean incremental; 


// setter and getter 
} 

Ce que je veux atteindre est, chaque fois que le nouvel objet de service que je veux enregistrer le même nom et propriétaire (peu importe si incrémental le champ de données sont les mêmes ou non) comme l'un des existant dans la base de données, ce sera une entrée dupliquée. Dans ce cas, je ne souhaite plus ajouter d'autre entrée dans la base de données. Comment réviser les fichiers hbm.xml pour éviter ce problème?

Répondre

1

Si vous avez besoin de la colonne identifiant, vous pouvez le garder. Ce dont vous avez besoin est * une contrainte unique au niveau de la base de données sur les deux colonnes.

(si vous utilisez hbmtoddl outil, vous pouvez avoir besoin quelque chose comme ça:

<properties name="key" unique="true"> 
    <property name="name" .../> 
    <property name="owner" .../> 
</properties> 

)

De cette façon, vous ne pouvez pas insérer des données de doublons.

Après que si vous ne voulez pas que votre code pour casser lorsque vous essayez d'insérer des doublons, vous devez

  • recherche par nom et le propriétaire (si vous le faites souvent, un indice pourrait être une bonne idée)
  • Si vous ne trouvez pas l'entrée, insérez-la
  • Vous pourriez également vouloir intercepter l'exception levée en cas de violation de contrainte unique (oui cela peut toujours se produire si deux threads insèrent des données en même temps) et réessayez un select.
1

Vous avez un certain nombre d'options:

  • définir votre clé primaire comme composite-id ou natural-id
  • avant d'enregistrer, utiliser une requête pour trouver s'il y a une autre ligne du même nom et propriétaire, et s'il y en a, prenez-le.

Quoi qu'il en soit, vous devez remplacer hashCode() et equals(..) en utilisant name et owner

+0

eh .. downvote est pourquoi? – Bozho

+0

Je pense que votre réponse est bonne ... quelqu'un sait pourquoi il est en baisse? – Lily

+0

son dos à 0 maintenant +1 Je pense que sa bonne réponse aussi bien – ant

2

Vous pouvez utiliser des annotations pour faire de même.

En plus de votre classe d'entité que vous écrivez ce qui suit:

@Table(uniqueConstraints = @UniqueConstraint(columnNames = { "name","owner"})) 
@Entity 
class Service 
{ 
    Long id; // auto increment 
    String name; 
    String owner; 

// setter and getter 
} 

Cela indiquera hibernent que le nom et propriétaire colonnes doivent être uniques ensemble.

+0

@Shervin Bon à savoir, Shervin (+1) –

Questions connexes