我正在将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,因此它可以动态创建查询
答案 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