我是hibernate和postgres的新手。实际上我正在尝试使用Hibernate映射potgres数据库。这是我在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 )
)
我正在尝试使用以下代码将记录添加到数据库
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;
}
当我执行代码时,我收到以下错误
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
我的数据库中有一个名为“employee_id_seq”的序列。但我不知道为什么数据库正在寻找hibernate_seq。有人可以解释错误和原因。
提前致谢!
添加了信息
这是我的员工类
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;
}
}
答案 0 :(得分:21)
您尚未发布重要位:Employee
类。
但我的猜测是你的Employee类使用@GeneratedValue()
而没有指定要使用的序列。因此,Hibernate使用其默认名称:hibernate_sequence。
您可以提供序列名称作为GeneratedValue注释的一部分。例如。
@GeneratedValue(strategy=SEQUENCE, generator="employee_id_seq")
答案 1 :(得分:10)
在您的域或模型对象中,如下所示注释id字段,它应该可以工作。对我而言,GenerationType.AUTO失败
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
答案 2 :(得分:6)
简单的解决方案:
将hibernate_sequence表创建为:
"create sequence <schema>.hibernate_sequence"
答案 3 :(得分:1)
如果您不使用注释,则应更改YourClass.hbm.xml文件。
您的ID部分应为:
<id name="id" type="int" column="id">
<generator class="sequence">
<param name="sequence">employee_id_seq</param>
</generator>
</id>
档案样本:
<?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>
答案 4 :(得分:1)
你可以做两件事。 一种是手动创建一个空白的hibernate_sequence表postgresql。 第二,很可能与用户帐户权限冲突,不允许grails创建该表。
答案 5 :(得分:0)
对我来说,导致此错误的原因是MySql.Data库的版本错误。
我在web.config中定义了6.9.6.0版,但实际引用的版本较旧。
我刚评论说:
<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>
答案 6 :(得分:0)
如果您在Spring Boot或Spring Boot / Hibernate Migration中遇到此问题,则可以尝试以下方法
https://mkyong.com/spring-boot/spring-boot-mysql-table-db_name-hibernate_sequence-doesnt-exist/
答案 7 :(得分:0)
除了创建表hibernate_sequence之外,该表具有一列next_val 您还可以设置quarkus.hibernate-orm.database.generation =拖放并创建。请注意,这将删除数据库中的所有记录。