9
votes

Problème avec la séquence Pourquoi deux entités partageent la même séquence lors de la génération de schéma avec HBM2DDDL?

J'utilise hbm2ddl code> dans mon application basée sur hibernate pour générer le schéma de base de données. La valeur de hibernate.hbm2ddl.auto code> La propriété est create-goutte code>.

J'utilise @entity code> annotations pour mes classes de pojo. P>

@Entity 
public class testTable1 {
     @Id     
     @GeneratedValue(strategy = GenerationType.SEQUENCE)
     Long id; 
}

@Entity 
public class testTable2 {
     @Id     
     @GeneratedValue(strategy = GenerationType.SEQUENCE)
     Long id; 
}


0 commentaires

3 Réponses :


9
votes

Vous utilisez le générateur de séquence global que l'hibernate fournit par défaut lorsque aucun générateur n'est fourni tel que spécifié par la spécification JPA. Pour avoir un générateur privé, vous devez déclarer un générateur privé avec l'annotation @SEfenceGenerator et définir l'attribut générateur du @generatedValue Annotation

Extrait de Javadoc

@generatedValue de
(Facultatif) Nom du générateur de clés primaire à utiliser comme spécifié dans l'annotation de séquence générateur ou de la table de table.

par défaut du générateur d'identifiant fourni par le fournisseur de persistance.

séquenceGenerator
Cette annotation définit un générateur de clé primaire qui peut être référencé par son nom quand un L'élément générateur est spécifié pour l'annotation généréeValue. UNE Le générateur de séquence peut être spécifié sur la classe d'entité ou sur le champ principal principal ou propriété. La portée du nom du générateur est Global à l'unité de persistance (à travers tous les types de générateurs).

Exemple:

@SEfenceGenerator (nom = "EMP_SEQ", séquencename = "Private_ Suite")

hibernate recommande que de nouveaux projets utilisent hibernate.id.new_generator_mappings = true car les nouveaux générateurs sont plus efficaces et plus près de la spécification JPA 2 Spécifications Sémanque

Section 1.3. Propriétés
2.2.3. Cartographie des propriétés d'identificateur

Exemple complet xxx


2 commentaires

Vrai et je voudrais ajouter que si vous souhaitez définir la valeur initiale de la valeur et de l'allocation, vous devez inclure hibernate.id.new_generator_mappings = true. Ensuite, il vous suffit d'utiliser @SesfenseGenerator comme ceci: @SeSeLenceGenerator (InitialValue = 1, allocationsize = 1, nom = "privé_seq", séquencename = "Private_Srequence") ou quelles que soient les valeurs dont vous avez besoin pour donner.


@BreakingBenjamin Puis-je utiliser le même générateur de séquence même pour une entité multiple que celle indiquée ci-dessus et obtenez des valeurs d'identification exclusives uniformes dans chaque entité? Je veux dire que chaque identifiant d'entité commencera avec 1 et obtenir l'incrément de 1.



0
votes

dans hibernate 5.2 ,

J'avais essayé la réponse de Joel Hudon, mais je ne sais pas pourquoi cela ne fonctionne pas.

J'ai trouvé des codes plus courts à résoudre IT.

3.2. La classe Java d'entité annotée xxx

Il pourrait donner un numéro de séquence unique.

espère qu'il aide.


0 commentaires

1
votes
 @Entity
    public class MyEntity2 {
        
        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="myentity2_seq")
        @SequenceGenerator(name = "myentity2_seq",sequenceName = "myentity2_seq_table")
        private int id;

    @Column(length = 100)
    private String name;
//setters & getters ...
}
In the Database, it will create myentity2_seq_table Table for maintaining ids. we can customize table creation using initialValue = 100, allocationSize = 10 in SequenceGenerator.

0 commentaires