如何设置在Java JPA / Hibernate中未自动生成的@Id主键?

时间:2019-06-25 02:24:15

标签: java postgresql hibernate spring-boot jpa

我正在将Postgres与Java JPA / Hibernate一起使用,并希望将id字段设置为我手动生成的字段。即,每当我创建此对象的实例时,无论如何我都会设置id字段。

我已经尝试了好几个星期,但还是遇到以下问题:“找不到类的必需标识符属性”或“保存后,标识符不能为空”。

以下是我正在使用的模型类的示例:

import javax.persistence.*;

@Entity
@Table(name = "pojo")
public class Pojo {

    @Id
    @Column(name = "id_one")
    private int idOne;

    @Column(name = "bool_example")
    private boolean boolExample;

    public Pojo(){};

    public Pojo(int idOne, boolean boolExample){
        this.idOne = idOne;
        this.boolExample = boolExample;
    }

    public int getIdOne() {
        return idOne;
    }

    public void setIdOne(int idOne) {
        this.idOne = idOne;
    }

    public boolean isBoolExample() {
        return boolExample;
    }

    public void setBoolExample(boolean boolExample) {
        this.boolExample = boolExample;
    }
}

这是我正在打电话的示例请求

    @GetMapping(value = "/plswork")
    public String pojotestone(){
        Pojo newpojo = new Pojo(1, false);
        pojoService.saveThis(newpojo);

        pojoService.test();
        return "yes";
    }
  

pojoService调用pojoRepository.save(T实体)。这个pojoRepository来自扩展CrudRepository,因此它可以动态创建查询

2 个答案:

答案 0 :(得分:0)

对于所有想知道的人,

是-可能有一个人工ID,这在实体具有固有ID属性的多个用例中才有意义。 (例如信用卡,银行帐户等)

对于这个问题,事实证明它与Spring JDBC不兼容。解决方案是改用spring-boot-starter-data-jpa,并且已使用存储库扩展了JPARepository而不是CrudRepository。

答案 1 :(得分:-1)

在休眠状态下,我们有ID生成策略。您可以使用其中之一来生成ID。 您可以使用@GeneratedValue批注来使用其中一种策略。

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

@GeneratedValue可以使用4种生成类型: AUTO IDENTITY SEQUENCE TABLE

如果我们未明确指定值,则生成类型默认为AUTO。

-持久性提供程序必须使用基础数据库表为实体分配主键,以确保唯一性

序列-指定使用数据库序列以确保唯一性

身份-指定使用数据库身份列

自动-持久性提供程序应为特定数据库选择合适的策略

您可以点击此链接:- https://blog.eyallupu.com/2011/01/hibernatejpa-identity-generators.html