![](/img/trans.png)
[英]org.hibernate.exception.SQLGrammarException: could not extract ResultSet and ERROR: relation “hibernate_sequence” does not exist
[英]Why am I obtaining this error related the auto increment PK of a PosgreSQL table using Hibernate? ERROR: relation "hibernate_sequence" does not exist
我正在使用Spring Data JPA 開發Spring Boot 應用程序。 作為數據庫,我使用 PostgreSQL,我發現將表的自動增量主鍵字段映射到實體類的相關字段時遇到了一些問題。
在我的數據庫中,我手動創建了這個表:
CREATE TABLE IF NOT EXISTS public."user"
(
id bigint NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 ),
first_name character varying(50) COLLATE pg_catalog."default" NOT NULL,
middle_name character varying(50) COLLATE pg_catalog."default" NOT NULL,
surname character varying(50) COLLATE pg_catalog."default" NOT NULL,
CONSTRAINT user_pkey PRIMARY KEY (id)
)
請不要將id字段(我的 PK)定義為具有GENERATED ALWAYS約束的bigint而不是串行(這是因為串行數據類型已被棄用,因為它不是 SQL 標准的一部分)。
然后我創建了這個實體類映射這個表:
package com.easydefi.users.entity;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Data;
@Entity
@Table(name = "portal_user")
@Data
public class User implements Serializable {
private static final long serialVersionUID = 5062673109048808267L;
@Id
@Column(name = "id")
private int id;
@Column(name = "first_name")
private String firstName;
@Column(name = "middle_name")
private String middleName;
@Column(name = "surname")
private String surname;
public User(String firstName, String middleName, String surname, char sex, Date birthdate, String taxCode,
String eMail, String contactNumber, Date createdAt) {
super();
this.firstName = firstName;
this.middleName = middleName;
this.surname = surname;
}
}
然后我有了這個存儲庫接口(目前它是空的,因為我只測試JpaRepository直接提供的save()方法):
public interface UsersRepository extends JpaRepository<User, Integer> {
}
最后,我創建了這個簡單的單元測試方法,以便通過我的存儲庫的save()方法測試新記錄的插入:
@SpringBootTest()
@ContextConfiguration(classes = GetUserWsApplication.class)
@TestMethodOrder(OrderAnnotation.class)
public class UserRepositoryTest {
@Autowired
private UsersRepository userRepository;
@Test
@Order(1)
public void testInsertUser() {
User user = new User("Mario", null, "Rossi", 'M', new Date(), "XXX", "xxx@gmail.com", "329123456", new Date());
userRepository.save(user);
assertTrue(true);
}
}
問題是,當執行save()方法時,我得到了這個異常:
Hibernate:
insert
into
portal_user
(first_name, middle_name, surname, id)
values
(?, ?, ?, ?)
2021-11-04 12:17:39.576 WARN 11436 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 428C9
2021-11-04 12:17:39.578 ERROR 11436 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : ERROR: cannot insert a non-DEFAULT value into column "id"
Detail: Column "id" is an identity column defined as GENERATED ALWAYS.
Hint: Use OVERRIDING SYSTEM VALUE to override.
所以我嘗試修改id字段到我的實體類的映射,方式如下:
@Id
@Column(name = "id")
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
但是現在運行我的測試方法save()方法執行給我另一個錯誤:
Hibernate:
select
nextval ('hibernate_sequence')
2021-11-04 12:20:21.133 WARN 11639 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 42P01
2021-11-04 12:20:21.136 ERROR 11639 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : ERROR: relation "hibernate_sequence" does not exist
Position: 17
問題是什么? 我錯過了什么? 我該如何嘗試解決這個問題?
改變
GeneratedValue(strategy=GenerationType.AUTO)
到
@GeneratedValue(strategy=GenerationType.IDENTITY)
因為GenerationType.IDENTITY
使用auto increment
創建primary key
並在數據庫中自動創建hibernate_sequence
表
錯誤肯定在這一行。
id bigint NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 ),
如果您想快速修復,可以將其更改為下面的一個。 SERIAL
在 Postgres 中工作得很好。 當然,它可能不會在其他數據庫上運行,但是 IT 項目多久進行一次數據庫遷移? 絕不。
id serial PRIMARY KEY NOT NULL,
這能解決您的問題嗎? 或者您出於某種原因需要在沒有 SERIAL 的情況下解決它?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.