目标是:我需要按以下方式自动递增键:“p1”、“p2”等。Postgres 不能有这样的序列,所以我设置了这样的默认值(我省略了不相关的列) :
-- schema.sql
CREATE SEQUENCE p_sequence;
CREATE TABLE product
(
id VARCHAR(100) DEFAULT 'p' || nextval('p_sequence'),
PRIMARY KEY (id)
);
package com.example.productapi.data.entity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import lombok.Getter;
import lombok.Setter;
@Entity
@Getter
@Setter
public class Product {
@Id
@Column(name = "id")
private String productId;
}
问题来了:当用户点击 POST 端点并尝试持久化没有 id 的实体时,Hibernate 会抛出
IdentifierGenerationException
(然后由 Spring 翻译)。这是因为它不允许持久化没有 id 的实体,除非有一些 @GeneratedValue
策略。这不是SEQUENCE
,因为我不完全依赖序列。如果 Hibernate 放松并只信任数据库(它将提供默认值),那就太好了。然而,这不会发生。
有哪些解决方法?
您正在使用序列。所以最好用 GenerationType.SEQUENCE 进行注释
@GeneratedValue(strategy = GenerationType.SEQUENCE)