7
votes

Comment mon identifiant est-il généré avec JPA en utilisant Hibernate avec la dialecte Oracle 10G?

J'ai du code: xxx

Comment hibernate fournit mon identifiant?

Je vois dans ma base de données là une séquence unique nommée «Hibernate_Efence» et aucune autre «tables spéciales» hibernate.


0 commentaires

4 Réponses :


0
votes

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

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.

donc hiberné doit faire quelque chose comme celui-ci, ou au lieu d'utiliser la gâchette faisant xxx

Remarque: exemple de ici


3 commentaires

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 sur insertion.



11
votes

En fait, votre 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, xxx pré>

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>

@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;

  ...
  ...

}


4 commentaires

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



4
votes

Pour nommer la séquence, vous devez définir le repencename dans votre @ ulenceGenerator Annotation: xxx

de note, si Vous utilisez un générateur préexistant, votre allocalisations sur doit correspondre à la taille de l'allocation de ce générateur.


0 commentaires

5
votes

Comment hibernate fournit mon identifiant?

Eh bien, vous avez explicitement dit au moteur JPA de générer automatiquement automatiquement (avec l'annotation @generatedValue ) à l'aide d'une stratégie de type séquence indiquant qu'une séquence de base de données 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 (par exemple Oracle) qui peuvent être utilisés pour générer des entiers uniques.

Je vois dans ma base de données là une séquence unique nommée 'Hibernate_Efence'

Vous n'avez pas utilisé l'élément d'annotation SEQUENCENNAME dans votre @ ulenceGenerator 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 ). Pour spécifier une séquence, faites-le comme ceci: xxx


0 commentaires