Postgres error in batch insert : relation "hibernate_sequence" does not exist position 17

JavaHibernatePostgresqlJpa

Java Problem Overview


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.

Java Solutions


Solution 1 - Java

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.

Solution 2 - Java

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;

What is a sequence?

Sequence is an ordered list of integers. The orders of numbers in the sequence are important. You can configure what is the min and max values, by what amount you should increment it:

CREATE SEQUENCE [ IF NOT EXISTS ] sequence_name
  [ AS { SMALLINT | INT | BIGINT } ]
  [ INCREMENT [ BY ] increment ]
  [ MINVALUE minvalue | NO MINVALUE ] 
  [ MAXVALUE maxvalue | NO MAXVALUE ]
  [ START [ WITH ] start ] 
  [ CACHE cache ] 
  [ [ NO ] CYCLE ]

No you can use functions like nextval('') in your SQL commands and in hibernate to get next value from the set. This is much cheaper than keepipng current primary key value in a sequence_table or looking for max PK value in existing table. So it provides an easy and cheap way to find next PK for given table.

All tables usually use a dedicated Sequance, and like in this example it was chosen as IdGenerator strategy.

Sore useful tutorial:

Solution 3 - Java

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

Solution 4 - Java

Check application.properties file.

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

Solution 5 - Java

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

Solution 6 - Java

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; 

Solution 7 - Java

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;

Solution 8 - Java

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.

Solution 9 - Java

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

Solution 10 - Java

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;

Solution 11 - Java

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 :)

Solution 12 - Java

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionkirtiView Question on Stackoverflow
Solution 1 - JavaVsevolod PoletaevView Answer on Stackoverflow
Solution 2 - JavaBeriView Answer on Stackoverflow
Solution 3 - JavaSameerView Answer on Stackoverflow
Solution 4 - JavaAbdelsalam MegahedView Answer on Stackoverflow
Solution 5 - JavaMayurView Answer on Stackoverflow
Solution 6 - JavaSergeantView Answer on Stackoverflow
Solution 7 - JavaIfesinachi BryanView Answer on Stackoverflow
Solution 8 - JavaMāris RubenisView Answer on Stackoverflow
Solution 9 - JavaVijay VikranthView Answer on Stackoverflow
Solution 10 - JavaZonView Answer on Stackoverflow
Solution 11 - JavaDostonView Answer on Stackoverflow
Solution 12 - JavaNyasha ChitiyoView Answer on Stackoverflow