Java 数据库中已存在具有该ID的元素

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

我正在进行一个practice Spring引导项目,该项目列出/添加/更新/删除mysql数据库中的数学问题。我使用SpringBoot和JPA来执行数据库操作。在我的例子中,db已经有了问题,按钮“listproblems”将所有按钮返回到一个表中。我可以毫无问题地编辑/删除。但是当涉及到添加新问题时,我不知道如何将新条目添加到数据库中。此时,我不知道该分享什么,但下面是当前的添加问题方法:

//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;