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;
}
}
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")
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;
Solution simple:
crée la table hibernate_sequence en tant que:
"create sequence <schema>.hibernate_sequence"
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>
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.
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>