简体   繁体   中英

hibernate cannot find sequence

I need a simple sequence which would give me incremented integers that I later on use as part of a String.

I made this sequence using postgresql command line:

CREATE SEQUENCE my_seq
INCREMENT BY 1

The sequence exists as I can query it from postgresql command line, But I'm trying to get the values using hibernate :

Query query = session.createSQLQuery("select nextval(:sequence);");
query.setParameter("sequence", "my_seq");
Long nextVal=((BigInteger)query.uniqueResult()).longValue();

And I am getting this exception:

ERROR: relation "my_seq" does not exist

The sequence values do NOT represent the attribute of any entity. I only need them to store the number of logins, but I do not store the logins as entities.

EDIT: I got it working by adding the scheme name to the query:

String query1 = "select nextval(myscheme.my_seq)";
Query query = session.createSQLQuery(query1);

I can't figure out why it needed the scheme though, as myscheme was already default and all other queries worked fine without specifying the scheme. If anyone can shed some light I shall accept its answer.

You don't need to map a sequence to an entity. Just leave the mapping as follow for the ID column of your entity, and the id of the tntity will be generated from the sequence my_seq. You don't need to call nextval(my_seq) or anything else.

@Entity("myEntity")
public class MyEntity {

   @Id
   @Column(name = "id", unique = true, nullable = false, insertable=false)
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_seq")
   @SequenceGenerator(name = "my_seq", sequenceName = "my_seq", allocationSize = 1)
   private long id;
}

Below is the logic which will use a sequence called "my_seq" from the database and map it to the column "column_name" table "table_name"

Soon after you import the classes the sequence generator should be placed before you begin the class

@Entity
@org.hibernate.annotations.Entity(dynamicInsert = true, dynamicUpdate = true)
@Table(name = "table_name")
@SequenceGenerator(name = "my_seq", sequenceName = "my_seq")

public class ClassName implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "my_seq")
@Column(name = "column_name")
private Long columnName;

}

Let me know if this is useful.

In order to avoid hardcoding schema to your query, you can set hibernate.default_schema property in your persistence.xml as follows.

<property name="hibernate.default_schema" value="myscheme"/>

This could be also used in spring configuration file as is stated here .

I had to create a sequence on postgresql after creating a table. Remember, its not a good idea keep spring taking care of DB sequence. Remove @GeneratedValue(strategy=GenerationType.SEQUENCE) ,

add on your model

@GeneratedValue(generator="my_seq")
@SequenceGenerator(name="my_seq",sequenceName="MY_SEQ", allocationSize=1)

and run on SQL

CREATE SEQUENCE my_seq
INCREMENT BY 1;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM