web-dev-qa-db-fra.com

Erreur Postgres dans l'insertion de lot: la relation "hibernate_sequence" n'existe pas position 17

J'effectue la mise à jour par lots hibernate jpa et sa donne l'erreur suivante

2015-04-21 15:53:51,907 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (Thread-283 (HornetQ-client-global-threads-462057890)) SQL Error: 0, SQLState: 42P01
2015-04-21 15:53:51,908 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (Thread-283 (HornetQ-client-global-threads-462057890)) ERROR: relation "my_seq_gen" does not exist

J'utilise la base de données postgres et mon identifiant est généré automatiquement 

  @Id
@SequenceGenerator(name="seq-gen",sequenceName="MY_SEQ_GEN"initialValue=205, allocationSize=12)
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="seq-gen")
@Column(name="\"ID\"",unique=true,nullable=false)
private int id;

Ceci est mon extrait de code d'insertion de lot

getEm().getTransaction().begin();
System.out.println("transaction started--------------");
try {   
    for (Receipt ReceiptEntity : arrReceiptEntity) {
            getEm().persist(ReceiptEntity);
    }
    getEm().getTransaction().commit();
    System.out.println("commited");
} catch (Exception exception) {
    System.out.println("error----------------------------------------------------------------------");
    if(getEm().getTransaction().isActive())
        getEm().getTransaction().rollback();
    LOG.error(exception);
} finally {
    getEm().flush();
    getEm().clear();
    getEm().close();
}

J'ai ajouté la propriété suivante dans persistence.xml

         <property name="hibernate.id.new_generator_mappings" value="true"/>

S'il vous plaît suggérer ce que je fais mal.

17
kirti

Essayez d’annoter votre id avec @Id et @GeneratedValue(strategy=GenerationType.IDENTITY). Cela a fonctionné pour moi avec PostgreSql.

UPDATE: Cela ne fonctionnera que si votre colonne id a été déclarée comme étant de type SERIAL ou BIGSERIAL.

28
Vsevolod Poletaev

Si vous ne souhaitez pas modifier la définition de votre entité, vous devez créer une séquence dans votre schéma postgreSQL avec le nom hibernate_sequence.

CREATE SEQUENCE hibernate_sequence START 1;

METTRE &AGRAVE; JOUR:

Il manque la seconde séquence generatef, que vous avez définie pour votre entité, ajoutez-la simplement comme la précédente

CREATE SEQUENCE my_seq_gen START 1;

Didacticiel utile: http://www.concretepage.com/hibernate/generatedvalue-strategy-generationtype-sequence-hibernate

11
Beri

J'espère que vous aurez la réponse, mais si vous trouvez toujours la réponse, cela pourrait être utile.

J'ai eu le même problème et je l'ai résolu en annotant la méthode getter de l'id avec @SequenceGenerator et @GeneratedValue.

@SequenceGenerator(name="seq-gen",sequenceName="MY_SEQ_GEN", initialValue=205, allocationSize=12)
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="seq-gen")
public int getId(){
    return id;
}
6
Sameer

Pouvez-vous essayer de suivre: 

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO, generator = "auto_gen")
  @SequenceGenerator(name = "auto_gen", sequenceName = "A")
  @Column(name = "ID")
  private int id;

Merci

3
Mayur

J'avais le même problème. J'ai résolu de mettre l'incrémentation automatique sur la colonne id de la table sur postgres cela fonctionne, comme ça.

ALTER TABLE mytable ALTER COLUMN id SET DEFAULT nextval('mytable_id_seq');

ALTER SEQUENCE mytable_id_seq OWNED BY mytable.id; 
2
Sergeant

Dans mon cas, ajouter la propriété name = "hibernate.hbm2ddl.auto" value = " update " a résolu le problème. Vous devez ajouter la propriété mentionnée dans persistence.xml

1
Vijay Vikranth

Selon un post, hibernate ne pourrait pas obtenir la valeur de séquence suivante , définissez votre colonne @GeneratedId avec la stratégie GenerationType.IDENTITY au lieu de GenerationType.SEQUENCE. Donc, vous auriez 

@Id
@SequenceGenerator(name="seq-gen",sequenceName="MY_SEQ_GEN"initialValue=205, allocationSize=12)
@GeneratedValue(strategy= GenerationType.IDENTITY, generator="seq-gen")
@Column(name="\"ID\"",unique=true,nullable=false)
private int id;
1
Ifesinachi Bryan

Parfois, avec l'annotation @Id @GeneratedValue(strategy=GenerationType.IDENTITY) vous pouvez avoir votre séquence avec intervalles vides (après suppression) et position d'auto-incrémentation suivante incorrecte . Essayez de définissez la valeur d'auto-incrémentation suivante sur la position après la plus grande valeur id:

ALTER SEQUENCE schema.entity_id_seq RESTART WITH 40072;
0
Zon