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

Posted

技术标签:

【中文标题】如何设置在 Java JPA/Hibernate 中不是自动生成的 @Id 主键?【英文标题】:How to set an @Id primary key that is NOT Auto-Generated in Java JPA/Hibernate? 【发布时间】:2019-11-06 19:39:41 【问题描述】:

我正在使用带有 Java JPA/Hibernate 的 Postgres,并希望将 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 entity)。这个 pojoRepository 来自扩展 CrudRepository,因此它可以动态创建查询

【问题讨论】:

查看此答案以了解有关 @Id -> ***.com/questions/36275309/… 的一些信息。它不会为您生成 PK,而只会为您生成列。 尝试Integer 而不是int。同时覆盖equalshashcode。并确保您已在架构级别定义主键。 映射看起来不错。 pojoService.saveThis(newpojo); 的代码是什么? 请问为什么要手动生成ID? 为什么不呢?在业务用例中使用手动 id 很有意义。信用卡类可以将信用卡号作为主键,用户可以将用户名/ID 作为主键。用例有效。 【参考方案1】:

对于所有想知道的人,

是的 - 可以有一个手动 id,这在实体具有固有 id 属性的多个用例中是有意义的。 (如信用卡、银行账户等)

至于这个问题,原来是与Spring JDBC不兼容。解决方案是改用 spring-boot-starter-data-jpa,并且 让存储库扩展 JPARepository 而不是 CrudRepository。

【讨论】:

以上是关于如何设置在 Java JPA/Hibernate 中不是自动生成的 @Id 主键?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JPA/Hibernate 在孩子的 id 中引用父母的 id?

如何更新 Spring Data JPA @Modifying @Query 查询中的 JPA/Hibernate @Version 字段?

如何使用 BooleanBuilder (QueryDSL) 为可选的 OnetoOne JPA/Hibernate 关系建模谓词?

JPA+Hibernate+Mysql查询语言问题

Spring JPA Hibernate 和 AttributeConverter

JPA hibernate spring repository pgsql java 工程:sql文件导入数据,测试数据