web-dev-qa-db-fra.com

Séquence ou table manquante: hibernate_sequence

Je suis nouveau pour hiberner et postgres. En fait, j'essaie de mapper la base de données de Potgres en utilisant Hibernate. Ceci est ma structure de table en postgresql

CREATE TABLE employee
(
id serial NOT NULL,
firstname character varying(20),
lastname character varying(20),
birth_date date,
cell_phone character varying(15),
CONSTRAINT employee_pkey PRIMARY KEY (id )
)

J'essaie d'ajouter un enregistrement à la base de données en utilisant le code suivant

 System.out.println("******* WRITE *******");
    Employee empl = new Employee("Jack", "Bauer", new Date(System.currentTimeMillis()), "911");
    empl = save(empl);



 //This is the save function

    private static Employee save(Employee employee) {
    SessionFactory sf = HibernateUtil.getSessionFactory();
    Session session = sf.openSession();

    session.beginTransaction();


    int id = (Integer) session.save(employee);
    employee.setId(id);

    session.getTransaction().commit();

    session.close();

    return employee;
}

Quand j'exécute le code, j'obtiens l'erreur suivante

org.hibernate.HibernateException: Missing sequence or table: hibernate_sequence
Exception in thread "main" Java.lang.ExceptionInInitializerError
at org.tcs.com.Hibernate.HibernateUtil.buildSessionFactory(HibernateUtil.Java:18)
at org.tcs.com.Hibernate.HibernateUtil.<clinit>(HibernateUtil.Java:8)
at org.tcs.com.Hibernate.MainApp.list(MainApp.Java:51)
at org.tcs.com.Hibernate.MainApp.main(MainApp.Java:17)
Caused by: org.hibernate.HibernateException: Missing sequence or table: hibernate_sequence
at org.hibernate.cfg.Configuration.validateSchema(Configuration.Java:1282)
at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.Java:155)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.Java:498)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.Java:1740)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.Java:1778)
at org.tcs.com.Hibernate.HibernateUtil.buildSessionFactory(HibernateUtil.Java:15)
... 3 more

J'ai la séquence appelée "employee_id_seq" dans ma base de données. Mais je ne sais pas pourquoi la base de données recherche hibernate_seq. Quelqu'un pourrait-il expliquer l'erreur et la raison.

Merci d'avance!

Informations complémentaires

Ceci est ma classe d'employé

import Java.sql.Date;

public class Employee {

private int id;

private String firstname;

private String lastname;

private Date birthDate;

private String cellphone;

public Employee() {

}

public Employee(String firstname, String lastname, Date birthdate, String phone) {
    this.firstname = firstname;
    this.lastname = lastname;
    this.birthDate = birthdate;
    this.cellphone = phone;

}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getFirstname() {
    return firstname;
}

public void setFirstname(String firstname) {
    this.firstname = firstname;
}

public String getLastname() {
    return lastname;
}

public void setLastname(String lastname) {
    this.lastname = lastname;
}

public Date getBirthDate() {
    return birthDate;
}

public void setBirthDate(Date birthDate) {
    this.birthDate = birthDate;
}

public String getCellphone() {
    return cellphone;
}

public void setCellphone(String cellphone) {
    this.cellphone = cellphone;
}



}
16
Lakshmi

Vous n'avez pas posté le bit important: la classe Employee.

Mais je suppose que votre classe Employé utilise @GeneratedValue() sans spécifier la séquence à utiliser. Ainsi, Hibernate utilise son nom par défaut: hibernate_sequence.

Vous pouvez fournir un nom de séquence dans le cadre de l'annotation GeneratedValue. par exemple. 

@GeneratedValue(strategy=SEQUENCE, generator="employee_id_seq")
20
David Lavender

Dans votre domaine ou votre objet Modèle, annotez le champ id comme ci-dessous et cela devrait fonctionner. Pour moi, le GenerationType.AUTO a échoué

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
7
user1419261

Solution simple:

crée la table hibernate_sequence en tant que:

"create sequence <schema>.hibernate_sequence"
5
Riddhi Gohil

Si vous n'utilisez pas d'annotation, vous devez modifier le fichier YourClass.hbm.xml.

Votre section d'identification devrait être:

<id name="id" type="int" column="id">
     <generator class="sequence">
         <param name="sequence">employee_id_seq</param>
     </generator>
</id>

Exemple de fichier:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD//EN"
 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping>
   <class name="Employee" table="EMPLOYEE">
      <meta attribute="class-description">
         This class contains the employee detail. 
      </meta>
      <id name="id" type="int" column="id">
         <generator class="sequence">
             <param name="sequence">employee_id_seq</param>
         </generator>
      </id>
      <property name="firstName" column="first_name" type="string"/>
      <property name="lastName" column="last_name" type="string"/>
      <property name="salary" column="salary" type="int"/>
   </class>
</hibernate-mapping>
1
oleh.kovaliuk

Vous pouvez faire deux choses .. La première consiste à créer manuellement une table vide hibernate_sequence postgresql. Deux, il y a probablement un conflit avec les autorisations de compte d'utilisateur qui ne permettent pas à Grails de créer cette table.

1
Daniel

Pour moi, la cause de cette erreur était la mauvaise version de la bibliothèque MySql.Data.

J'avais une version 6.9.6.0 définie dans le fichier web.config et pourtant la version référencée réelle était plus ancienne.

Je viens de commenter:

     <system.data>
      <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient" />
        <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
     </DbProviderFactories>
   </system.data>
0
Chipo Hamayobe