J'ai du code: Comment hibernate fournit mon identifiant? p> Je vois dans ma base de données là une séquence unique nommée «Hibernate_Efence» et aucune autre «tables spéciales» hibernate. p> p>
4 Réponses :
dans Oracle, vous n'avez pas le type auto_incrètent comme dans MySQL. Donc, pour générer une colonne Auto_inCremmentation, vous devez utiliser une séquence.
Ceci est un exemple de la manière dont vous pouvez y parvenir. P> de sorte que vous créez une séquence et utilisez Un déclencheur avant chaque rangée est inséré pour ajouter son identifiant. P> donc hiberné doit faire quelque chose comme celui-ci, ou au lieu d'utiliser la gâchette faisant p> Remarque: exemple de ici P> P>
Merci. En effet Oracle n'a pas la capacité Auto_inCrimentation. Cependant, quand je sauvegarder mon @ entité's, je laisse mon @ID champs null. Lequel alors l'entitémanager génère en quelque sorte un identifiant de quelque part et l'insère. Je sais que lorsque j'acte la sortie SQL à la console. Alors revenant à ma question, d'où vient cette pièce d'identité avec ma configuration?
Il utilise la séquence à coup sûr. Maintenant, s'il utilise la gâchette ou l'insert inline, configurez Hibernate pour afficher SQL ou vérifier si un déclencheur a été généré.
Hibernate n'utilise pas de déclencheur, il obtient simplement le nextval code> sur insertion.
En fait, votre Vous pouvez absolument ignorer cette configuration à l'aide de l'annotation à la place. Ensuite, votre annotation code> @SEfenceGenerator code> devrait fournir quelques souris supplémentaires. Ci-dessous l'exemple. P> quelque chose_seq code> est le nom de la séquence que vous avez configurée quelque part dans votre configuration hibernate. Et
hibernate_srequence code> est le nom de la séquence dans la base de données. Dans la configuration, il ressemblerait à quelque chose comme ci-dessous,
@Entity
public class Entity1 {
@Id
@SequenceGenerator(name = "entity1Seq", sequenceName="ENTITY1_SEQ", allocationSize=1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "entity1Seq")
@Column(name = "ID", nullable = false)
private Long id;
...
...
}
@Entity
public class Entity2 {
@Id
@SequenceGenerator(name = "entity2Seq", sequenceName="ENTITY2_SEQ", allocationSize=10)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "entity2Seq")
@Column(name = "ID", nullable = false)
private Long id;
...
...
}
Merci. Mais dans mon cas, comment Hibernate fournit-il mon identifiant? Comme lorsque je sauvegarde mon entité avec une valeur nulle pour mon identifiant long, il est par magie est inséré par magie. Est-ce via une table spéciale, ou utilise-t-elle cet hibernate_Suence? Ou..?
Utilisation du Hibernate-SEQ code> et bien sûr lorsque vous avez dit Hibernate de le générer, vous ne devez vous fournir aucun vous-même. Ou même si vous fournissez une certaine valeur par disection, cette valeur serait écrasée.
Dites-vous que plusieurs entités partagent cette même séquence hibernate?
Pas nécessairement. Vous pouvez définir le contraire, vérifier mon addemdum. Si vous avez défini une seule séquence pour chaque entité, alors oui, il utilisera la même séquence.
Pour nommer la séquence, vous devez définir le repencename de note, si Vous utilisez un générateur préexistant, votre code> dans votre
@ ulenceGenerator code> Annotation:
allocalisations sur code> doit correspondre à la taille de l'allocation de ce générateur. p> p>
Comment hibernate fournit mon identifiant? p>
Eh bien, vous avez explicitement dit au moteur JPA de générer automatiquement automatiquement (avec l'annotation code> @generatedValue code>) à l'aide d'une stratégie de type
séquence code> indiquant qu'une séquence de base de données em> doit être utilisé pour générer l'identifiant. Si vous vous demandez, des séquences sont Objets spécifiques à la base de données EM> (par exemple Oracle) qui peuvent être utilisés pour générer des entiers uniques. P>
Je vois dans ma base de données là une séquence unique nommée 'Hibernate_Efence' P> blockQuote>
Vous n'avez pas utilisé l'élément d'annotation CODE> SEQUENCENNAME dans votre
@ ulenceGenerator code> Pour spécifier le nom de l'objet de séquence de base de données à utiliser afin que hibernate a créé une valeur par défaut. Objet de séquence pendant la génération de schéma (qui est par défaut à
hibernate_srequence code>). Pour spécifier une séquence, faites-le comme ceci: p>
xxx pré> blockquote>