簡體   English   中英

為什么我會收到與使用 Hibernate 的 PosgreSQL 表的自動增量 PK 相關的錯誤? 錯誤:關系“hibernate_sequence”不存在

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM