Différence entre @GeneratedValue et @GenericGenerator
Je trouve parfois ensemble, parfois seul... d'autres fois, ils semblent faire de même.
Quelle est la différence?
Voici trois exemples. Que font-ils de différent? Pourquoi ne puis-je pas utiliser juste @GeneratedValue pour tous?
Exemple 1
@Id
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment", strategy = "increment")
Long id;
Exemple 2
@Id @GeneratedValue(strategy=GenerationType.SEQUENCE)
private int userId;
Exemple 3
@ElementCollection
@JoinTable(name="Address",
joinColumns=@JoinColumn(name="user_id")
)
@GenericGenerator(name="hilo-gen", strategy="hilo")
@CollectionId(columns = @Column(name="Address_id"), generator = "hilo-gen", type = @Type(type="long"))
Collection<Addr> listOfAddresses = new ArrayList<Addr>();
Vous devez vous connecter pour publier un commentaire.
Lors de l'utilisation d'un ORM il est souvent nécessaire afin de générer une valeur de clé primaire.
La
@GeneratedValue
annotation indique qu'une valeur pour une colonne, qui doit être annotée avec@Id
est généré. Les élémentsstrategy
etgenerator
sur l'annotation de décrire comment la valeur générée est obtenu.Il y a quatre valeurs possibles pour la
strategy
élément sur la@GeneratedValue
annotation:IDENTITY
,AUTO
,TABLE
etSEQUENCE
. Voir plus.Donc, pour répondre à Partie 2 de votre question, l'extrait de code indiquant que la valeur de
userId
fera par le biais d'une séquence dans la base de données.La
generator
élément de la@GeneratedValue
annotation indique le nom de la clé primaire du générateur. Dans Part1 de votre question, l'extrait de code indique qu'ungenerator
nomméincrement
sera utilisée pour obtenir la valeur de la clé primaire.increment
est alors définie dans la prochaine annotation@GenericGenerator
.@GenericGenerator
est une hibernate annotations utilisé pour désigner un générateur personnalisé, qui peut être une classe ou d'un raccourci vers un générateur fourni par Hibernate.increment
est un raccourci vers Hibernate générateur:Dans le Troisième Partie de votre question, le code utilise une
hilo
Hibernate générateur:D'étendre l' @kevin-bowersox de réponse.
Les relations entre les Hibernate clé primaire de la génération de stratégies spécifiques et générateur respectivement, comme indiqué dans
org.hibernate.id.IdentifierGeneratorFactory
En veille prolongée 4.3 j'ai trouvé
org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory
classe avec plus de 3 stratégies:Le au-dessus de quinze stratégies, plus
native
, il y en a seize génération de stratégies de prise en charge dans Hibernate par défaut.Exemple avec
native
:"native"
- est-il un "plus sûr" déclarant cette stratégie? Ne pouvez pas trouver un enum pour elle (je ne suis pas un grand fan de "magique" de chaînes de caractères).public static final String NATIVE = "native";
Donc de son mieux pour utiliser @GenericGenerator pour votre architecture. Mais si vous êtes lié à l'utilisation de @SequenceGenerator vous devez modifier manuellement votre séquence de deux autres attributs allocationSize=1 et initialValue=1. Et de travailler avec ces attributs, vous devez ajouter apropert dans votre hibernate.cfg.xml fichier