52
votes

I am performing hibernate jpa batch update and its giving me following error

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

I am using postgres database and my ID is auto generated

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

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

I have added the following property in persistence.xml

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

Please suggest what i am doing wrong.

12
try GenerationType.IDENTITY instead of GenerationType.AUTOPratik

12 Answers

80
votes

Try to annotate your id with @Id and @GeneratedValue(strategy = GenerationType.IDENTITY).

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

UPDATE: It will only work if your id column was declared as SERIAL or BIGSERIAL types.

21
votes

If you don't want to change your entity definition, then you need to create a sequence in your postgreSQL schema with name hibernate_sequence.

CREATE SEQUENCE hibernate_sequence START 1;

UPDATE:

You are missing second sequence generatef, which you defined for your entity, just add it like previous one:

CREATE SEQUENCE my_seq_gen START 1;

Sore useful tutorial: http://www.concretepage.com/hibernate/generatedvalue-strategy-generationtype-sequence-hibernate

8
votes

I hope you get the answer but if you are still finding the answer this could be helpful.

I had same problem and resolved it annotating getter method of the id with @SequenceGenerator and @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;
}
3
votes

Can you try following :

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

Thanks

3
votes

Check application.properties file.

make sure that spring.jpa.hibernate.ddl-auto = update

2
votes

I was with the same problem.I solved puting auto increment on id column from the table on postgres it works, like that.

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

ALTER SEQUENCE mytable_id_seq OWNED BY mytable.id; 
2
votes

According to a post, hibernate could not get next sequence value , set your @GeneratedId column with strategy GenerationType.IDENTITY instead of GenerationType.SEQUENCE. So, you would have

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

In my case adding property name="hibernate.hbm2ddl.auto" value="update", solved the issue. You have to add the mentioned property in persistence.xml

1
votes

Sometimes with @Id @GeneratedValue(strategy=GenerationType.IDENTITY) annotation you can have your sequence with empty intervals (after delete) and incorrect next autoincrement position. Try to set next autoincrement value to the position after biggest id value:

ALTER SEQUENCE schema.entity_id_seq RESTART WITH 40072;
0
votes
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
0
votes

Add the following to your application.properties

# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = update 

This will explicitly set to create or update all tables during Spring startup.

-1
votes

Recently I had the same issue and I have resolved it by using @GenericGenerator annotation. The issue was because I had to insert hundreds of rows with SQL statements in liquibase changelog and somehow hibernate does not pick up last row and its before generating id.

@Entity(name = "domain")
@Table(name = "domain", schema = "public")
public class DomainJpa {

    @Getter
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "incrementDomain")
    @GenericGenerator(name = "incrementDomain", strategy = "increment")
    private Integer id;

}

hopefully this can be useful for someone. Cheers :)