#spring #hibernate #spring-data-jpa #postgresql-9.5
#java #спящий режим #postgresql
Вопрос:
Я новичок в hibernate и postgres. На самом деле я пытаюсь сопоставить базу данных potgres с помощью Hibernate. Это моя структура таблицы в 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. Может кто-нибудь объяснить ошибку и причину.
Заранее спасибо!
Добавлена информация
Это мой класс employee
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;
}
}
Комментарии:
1. Я бы сказал, что Hibernate не знает, что вы используете последовательности. Похоже, он хочет использовать собственную домашнюю (медленную) таблицу последовательностей. Должно быть какое-то указание, сообщающее Hibernate, что ваш
id
столбец связан с последовательностью.2. @Lakshmi вы решили проблему?
Ответ №1:
В вашем домене или объекте модели аннотируйте поле id, как показано ниже, и оно должно работать. Для меня GenerationType .АВТОМАТИЧЕСКИЙ сбой
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
Комментарии:
1. Можете ли вы сказать, почему GenerationType . Сбой АВТО?
2. Я предупрежу всех, что этот ответ будет работать, но это приведет к огромному снижению производительности для Hibernate. Это сделает две записи за вставку: одну, чтобы выяснить, каким будет идентификатор, а затем после этого для выполнения фактического сохранения. Реальный ответ — тот, который предоставлен @David Lavender
Ответ №2:
Вы не опубликовали важный бит: Employee
класс.
Но я предполагаю, что ваш класс Employee использует @GeneratedValue()
без указания используемой последовательности. Итак, Hibernate использует свое имя по умолчанию: hibernate_sequence .
Вы можете указать имя последовательности как часть аннотации GeneratedValue. например.
@GeneratedValue(strategy=SEQUENCE, generator="employee_id_seq")
Комментарии:
1. Я не использую никаких аннотаций в своем классе employee. Теперь я добавил класс employee в свой вопрос
2. То же самое здесь, я использую только одно генерируемое значение (strategy = GenerationType . АВТО) в абстрактности, расширенной всеми 126 объектами моей схемы. Это отлично работает на MySQL, H2 и HSQLDB. Теперь моя схема Oracle имеет одну последовательность для каждой таблицы, поэтому, я думаю, мне нужно скопировать вставку всех моих объектов модели для случая Oracle. Вздох…
3. В зависимости от вашей базы данных вы также можете указать
@Generated(GenerationTime.INSERT)
вместо4. Я использую postgres, и
@GeneratedValue(generator="sequence_name")
этого было достаточно, и он работал с первичными ключами и их последовательностями.
Ответ №3:
Простое решение :
создайте таблицу hibernate_sequence как :
"create sequence <schema>.hibernate_sequence"
Комментарии:
1. Это весело : -D 🤣
Ответ №4:
Если вы столкнулись с этим при весенней загрузке или миграции Spring boot / Hibernate, то, возможно, вы можете попробовать следующее
По умолчанию Hibernate генерирует ключ из таблицы hibernate_sequence, мы можем отключить его, установив для этого hibernate.use-new-id-generator-mappings значение false .
application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=mkyong
spring.datasource.password=password
spring.jpa.hibernate.use-new-id-generator-mappings=false
Ответ №5:
Если вы не используете аннотацию, вам следует изменить 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>
Ответ №6:
Вы можете сделать две вещи. Один из них — просто вручную создать пустую таблицу hibernate_sequence postgresql. Во-вторых, скорее всего, существует конфликт с разрешениями учетной записи пользователя, не позволяющий grails создавать эту таблицу.
Комментарии:
1. В частности, проблема здесь заключается в том, используется ли стратегия на основе последовательности для генерации идентификатора. Это наиболее эффективный метод, но для него требуется, по крайней мере, существующая последовательность по умолчанию.
Ответ №7:
Помимо создания таблицы hibernate_sequence, в которой есть столбец next_val, вы также можете установить quarkus.hibernate-orm.database.generation = удаление и создание. Обратите внимание, что это приведет к удалению всех записей в вашей базе данных.
Ответ №8:
Для меня причиной этой ошибки была неправильная версия MySQL.Библиотека данных.
У меня была версия 6.9.6.0, определенная в web.config, и все же фактическая ссылочная версия была старше.
Я только что прокомментировал :
<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>