在 Postgresql 上创建模式时,Hibernate 忽略 @GeneratedValue

Posted

技术标签:

【中文标题】在 Postgresql 上创建模式时,Hibernate 忽略 @GeneratedValue【英文标题】:Hibernate ignores @GeneratedValue when creating schema on Postgresql 【发布时间】:2022-01-22 21:10:56 【问题描述】:

我在 docker 上使用 Spring Boot 2.6.1、Hibernate 5.6.1 和 Postgresql 14.1。我有一个名为 person 的实体,它扩展了一个基本实体类。

@MappedSuperclass
public abstract class BaseEntity 
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    protected long id;

    public long getId() 
        return id;
    

    public void setId(long id) 
        this.id = id;
    

@Entity
public class Person extends BaseEntity 
    private String name;

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    


问题是当 Hibernate 在 Postgresql 上创建我的模式时,它会忽略 @GeneratedValue(strategy = GenerationType.AUTO) 并创建一个没有自动增量或标识机制的简单列。所以查询

    INSERT INTO person(name) VALUES('Bob')

执行错误。 错误:关系“人”的“id”列中的空值违反非空约束

【问题讨论】:

尝试使用 @Generated Value(strategy = GenerationType.IDENTITY) 默认情况下,根据 JPA 文档,这一代使用自动增量并为数据库分配值 e 开始使用 GenerationType.SEQUENCE 我已经尝试了所有 IDENTITY、TABLE 和 SEQUENCE 仍然没有任何反应。 【参考方案1】:

这可以由您在父类中定义的访问器产生

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
protected long id;

在 Java 中,如果子类没有定义另一个同名的字段,则在子类中继承公共字段和受保护字段。所以很可能你在子类中继承了它,但注释不包含在子类中。

尽量使其私有,使其不被继承。这样,JPA 供应商(Hibernate)就会知道在哪里查找该字段,并在这样做时找到正确的注释。

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id; 

【讨论】:

我什至摆脱了基类,在子类中将 id 设为私有,但没有任何区别。

以上是关于在 Postgresql 上创建模式时,Hibernate 忽略 @GeneratedValue的主要内容,如果未能解决你的问题,请参考以下文章

具有特定权限的 Postgresql 用户

PostgreSQL的表空间

postgresql模式创建修改删除

PostgreSQL '模式'的 MySQL 等价物是啥?

PostgreSQL 相同的触发器函数在 INSERT 上更新到不同的表(使用相同的模式)

PostgreSQL springboot spring data jpa 集成