在 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的主要内容,如果未能解决你的问题,请参考以下文章