it-swarm.com.de

Postgres-Fehler in Batch Insert: Die Relation "hibernate_sequence" existiert nicht an Position 17

Ich führe eine Aktualisierung des jpa-Batch-Updates durch, und es wird mir folgender Fehler angezeigt

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

Ich verwende eine Postgres-Datenbank und meine ID wird automatisch generiert 

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

Dies ist mein Batch-Insert-Code-Snippet

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();
}

Ich habe die folgende Eigenschaft in persistence.xml hinzugefügt

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

Bitte schlage vor, was ich falsch mache.

17
kirti

Versuchen Sie, Ihre id mit @Id und @GeneratedValue(strategy=GenerationType.IDENTITY) zu kommentieren. Bei PostgreSql hat es für mich funktioniert.

UPDATE: Es funktioniert nur, wenn Ihre ID-Spalte als SERIAL- oder BIGSERIAL-Typen deklariert wurde.

28

Wenn Sie Ihre Entitätsdefinition nicht ändern möchten, müssen Sie in Ihrem postgreSQL-Schema eine Sequenz mit dem Namen hibernate_sequence erstellen.

CREATE SEQUENCE hibernate_sequence START 1;

UPDATE:

Ihnen fehlt die zweite Sequenz generatef, die Sie für Ihre Entität definiert haben, fügen Sie sie wie zuvor hinzu:

CREATE SEQUENCE my_seq_gen START 1;

Sinnvolles Tutorial: http://www.concretepage.com/hibernate/generatedvalue-strategy-generationtype-sequence-hibernate

11
Beri

Ich hoffe, Sie erhalten die Antwort, aber wenn Sie immer noch die Antwort finden, kann dies hilfreich sein.

Ich hatte dasselbe Problem und es wurde das Annotieren der Getter-Methode der ID mit @SequenceGenerator und @GeneratedValue behoben.

@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

Kannst du folgendes versuchen: 

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

Vielen Dank

3
Mayur

Ich war mit dem gleichen Problem. Ich habe das automatische Inkrementieren der ID-Spalte aus der Tabelle auf Postgres gelöst. Es funktioniert so.

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

ALTER SEQUENCE mytable_id_seq OWNED BY mytable.id; 
2
Sergeant

In meinem Fall wurde durch Hinzufügen von property name = "hibernate.hbm2ddl.auto" value = " update " das Problem behoben. Sie müssen die erwähnte Eigenschaft in persistence.xml hinzufügen

1
Vijay Vikranth

Nach einem Beitrag konnte hibernate den nächsten Sequenzwert nicht erhalten , setzen Sie Ihre @GeneratedId -Spalte mit der Strategie GenerationType.IDENTITY anstelle von GenerationType.SEQUENCE. Also hättest du 

@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

Manchmal mit @Id @GeneratedValue(strategy=GenerationType.IDENTITY) annotation können Sie Ihre Sequenz mit leere Intervalle (nach dem Löschen) und falsche nächste Autoincrement-Position haben. Versuchen Sie, setzen Sie den nächsten Autoincrement-Wert an die Position nach dem größten ID-Wert:

ALTER SEQUENCE schema.entity_id_seq RESTART WITH 40072;
0
Zon