【问题标题】:Hibernate ignores @GeneratedValue when creating schema on Postgresql在 Postgresql 上创建模式时,Hibernate 忽略 @GeneratedValue
【发布时间】: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 仍然没有任何反应。

标签: java postgresql spring-boot hibernate


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我什至摆脱了基类,在子类中将 id 设为私有,但没有任何区别。
猜你喜欢
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 2020-09-04
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 2021-05-02
相关资源
最近更新 更多