Java 数据库中已存在具有该ID的元素
我正在进行一个practice Spring引导项目,该项目列出/添加/更新/删除mysql数据库中的数学问题。我使用SpringBoot和JPA来执行数据库操作。在我的例子中,db已经有了问题,按钮“listproblems”将所有按钮返回到一个表中。我可以毫无问题地编辑/删除。但是当涉及到添加新问题时,我不知道如何将新条目添加到数据库中。此时,我不知道该分享什么,但下面是当前的添加问题方法:Java 数据库中已存在具有该ID的元素,java,mysql,spring-boot,maven,jpa,Java,Mysql,Spring Boot,Maven,Jpa,我正在进行一个practice Spring引导项目,该项目列出/添加/更新/删除mysql数据库中的数学问题。我使用SpringBoot和JPA来执行数据库操作。在我的例子中,db已经有了问题,按钮“listproblems”将所有按钮返回到一个表中。我可以毫无问题地编辑/删除。但是当涉及到添加新问题时,我不知道如何将新条目添加到数据库中。此时,我不知道该分享什么,但下面是当前的添加问题方法: //This is in the ProblemController.java on the ser
//This is in the ProblemController.java on the server side application
@PostMapping("/post")
public void addProduct(@RequestParam("cont") String pcont) {
// Get a valid pid first
Iterable<Problem> problist = probRepository.findAll();
int min = 100000;
int max = 0;
int gap = 0;
for (Problem myprod : problist) {
if (myprod.getPid() < min) {
min = myprod.getPid();
}
if (myprod.getPid() > max) {
max = myprod.getPid();
}
}
for (int i = min + 1; i < max; i++) {
if (!probRepository.existsById(i)) {
gap = i;
break;
}
}
if (gap == 0) {
gap = max + 1;
}
System.out.println("max: " + max);
max = max + 1;
Problem prob = new Problem();
prob.setPid(max);
prob.setContent(pcont);
probRepository.save(prob);
}
这个函数基本上是遍历项目以找到最大索引,然后将索引增加1以获得下一个索引。但它仍然不起作用
如果您想看一些特别的东西来帮助我理解这一点,请告诉我。如果不看
问题
实体,就有点难以理解ID的情况
只是一些建议。请看:并检查关于@Id注释以及如何使用它的部分。另外,请记住,在不查看数据库的情况下,数据库中可能已经填充了主键。我建议您添加一个方法,在每次运行后清除数据库,或者在内存中使用H2 看起来您在这里显式重写
id
prob.setPid(最大值)代码>
这意味着spring不会自动生成下一个id。导致主键/外键约束冲突 谢谢。查看实体和代码,我想说您正在使用将自动生成ID的。您可以删除:
prob.setPid(max);
你的代码应该可以工作。
如果要设置ID,应使用:
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer pid;
您好@fjsventura,谢谢您的回复。我刚刚添加了问题实体。是的,我会看一下上面提到的参考资料。但是,请让我知道,如果你有任何其他在实体类看后。哦!这很有道理,谢谢你!我猜这可能是个问题,但现在我明白了。你知道我怎么修吗?我希望在表格中添加新问题。有点像将新问题附加到现有表中。我建议删除该行并尝试一下。我绝对不是spring或jpa的专家。关于id生成,这里有一个更好的主题:太棒了!这确实奏效了。删除@GeneratedValue注释实际上起到了作用。非常感谢你!嗯,这样做可以添加新行。但是,当我删除现有行时,新添加的问题不会进入删除位置。我的意思是,如果我从1,2,3,4,5,6中删除id为3的问题,当我添加新问题时,它会变为7,而不是3。这意味着新的ID是1,2,4,5,6,7。我试着寻找解决办法,但没有找到合适的解决办法。知道吗?这是数据库排序工作的标准方式。它将使用序列中的下一个整数。e、 g.最后+1。另外,我不是建议删除@GeneratedValue注释,而是删除prob.setPid(max);
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer pid;