2010-04-09 28 views
12

Je le code suivant:paramètre de schéma Hibernate ne fonctionne pas dans l'annotation @SequenceGenerator

@Entity 
@Table(name = "my_table", schema = "my_schema") 
@SequenceGenerator(name = "my_table_id_seq", sequenceName = "my_table_id_seq", 
        schema = "my_schema") 
public class MyClass { 
    @Id 
    @GeneratedValue(generator = "my_table_id_seq", 
        strategy = GenerationType.SEQUENCE) 
    private int id; 

} 

Database: Postgresql 8.4, Hibernate annotations 3.5.0-finale.

Lorsque vous enregistrez l'objet de MyClass génère la requête SQL suivante:

select nextval('my_table_id_seq') 

Donc, il n'y a pas de préfixe de schéma et donc la séquence ne peut pas être trouvé. Lorsque j'écris le sequenceName comme

sequenceName = "my_schema.my_table_id_seq" 

tout fonctionne. Est-ce que j'ai des malentendus sur la signification du paramètre schema ou est-ce un bug? Des idées comment faire fonctionner le paramètre de schéma?

+0

J'ai eu le même problème ici et mettre le schéma sur le nom de la séquence, comme vous l'avez fait. Mon @SequenceGenerator n'a pas de propriété de schéma. – BrunoJCM

Répondre

0

Hmmm, je ne travaille pas avec les entrailles de mise en veille prolongée bien, mais il y a quelques informations ici:

https://forum.hibernate.org/viewtopic.php?p=2406761

Vous pouvez également définir le schéma par défaut pour un utilisateur se connectant à PostgreSQL via ALTER USER. .. SET SEARCH_PATH

1

Cela ressemble à un bogue: le fournisseur JPA doit honorer le "nouveau" (depuis Java Persistence 2.0) schema et les attributs catalog de l'annotation @SequenceGenerator. Je suggère de soulever a Jira issue (les annotations et les projets de gestionnaire d'entité sont maintenant sous le noyau), n'a pu trouver aucun existant.

-5

Bonjour j'avais même problème

mais mis votre hibernate.hbm2ddl.auto mettre à jour et exécuter.

<property name="hibernate.hbm2ddl.auto">update</property> 
+1

Je sais que c'est bien après le fait, mais cette réponse est incorrecte parce que cela créerait simplement le générateur dans le schéma par défaut, ce qui pourrait ne pas être là où vous le voulez. – Jim

6

Même problème ici, ressemble à un bug pour moi. Je utilise en veille prolongée 3.6.7 En regardant le code source que je vois une méthode org.hibernate.cfg.annotations.reflection.JPAOverridenAnnotationReader#buildSequenceGeneratorAnnotation(Element element) qui semble copier les valeurs de name, sequence-name, initial-value et allocation-size attributs, mais je ne vois aucune référence à catalog ou schema

i attendu voir quelque chose d'analogue à la méthode getTable(Element tree, XMLContext.Default defaults) (de la même classe) qui a

annotation.setValue("schema", table.schema()); 
annotation.setValue("catalog", table.catalog());` 

ou buildTableGeneratorAnnotation qui a

copyStringAttribute(ad, element, "catalog", false); 
copyStringAttribute(ad, element, "schema", false); 

Donc, même si un peu hackish, le chemin - pour cette version au moins - semble préfixer le sequenceName comme vous le dites.

0

Essayez de déplacer l'annotation SequenceGenerator de la déclaration de classe de POJO vers la déclaration de champ id. Avec Hibernate 3.6.4 ce

@Entity 
@Table(name = "my_table", schema = "my_schema") 
public class MyClass { 
    @Id 
    @GeneratedValue(generator = "my_table_id_seq", 
       strategy = GenerationType.SEQUENCE) 
    @SequenceGenerator(name = "my_table_id_seq", sequenceName = "my_table_id_seq", schema = "my_schema") 
    private int id; 

} 

produit ce pour MySQL

create table my_schema.my_table_id_seq (
    next_val bigint 
); 

insert into my_schema.my_table_id_seq values (1); 

et ce pour PostgreSQL

create sequence my_schema.my_table_id_seq start 1 increment 50; 
1

Même problème, en utilisant Hibernate 4.3.6.Final, avec Spring 4.1.4.RELEASE, sur Oracle Database 11g édition Enterprise Edition 11.2.0.1.0.

ressemble à ceci est un bug =>https://hibernate.atlassian.net/browse/HHH-7232

Nous avons autour de la question en créant un synonyme dans le schéma A pointant vers la séquence dans le schéma B. Ce synonyme était ce que nous avons utilisé dans l'attribut de schéma de @SequenceGenerator annotation

+0

prétendument corrigé dans la version 5.x: https://hibernate.atlassian.net/browse/HHH-7232?focusedCommentId=74395&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-74395 –

4

Ma solution ressemble à ceci (JPA 2.1, Hibernate 4.3.8.Final, PostgreSQL 9.4):

@SequenceGenerator(name = "seq_name", sequenceName = "my_schema.seq_name", schema = "my_schema", allocationSize = 1, initialValue = 1) 
Questions connexes