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

Posted

技术标签:

【中文标题】具有该 ID 的元素已存在于数据库中【英文标题】:Element with that ID already exists in the database 【发布时间】:2020-09-19 06:10:59 【问题描述】:

我正在从事一个练习 Spring Boot 项目,该项目从 mysql 数据库中列出/添加/更新/删除数学问题。我正在使用带有 JPA 的 Spring Boot 来执行数据库操作。就我而言,数据库已经存在问题,并且按钮“listproblems”将所有按钮返回到表中。我可以毫无问题地编辑/删除。但是当涉及到添加新问题时,我不知道如何将新条目添加到数据库中。在这一点上,我不知道要分享什么,但这里是当前的 addProblem 方法:

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

Problem.java 实体类

@Entity
public class Problem 
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer pid;

    @Column(name = "content")
    private String content;

    public Integer getPid() 
        return pid;
    

    public void setPid(Integer pid) 
        this.pid = pid;
    

    public String getContent() 
        return content;
    

    public void setContent(String content) 
        this.content = content;
    


这个函数基本上是遍历项目以找到最大索引,然后将索引增加 1 以获得下一个索引。但它仍然不起作用。

如果您想看任何特别有助于我理解这一点的内容,请告诉我。

【问题讨论】:

【参考方案1】:

不看Problem Entity 有点难以理解ID情况。

只是一些建议。看一下:objectdb 和 Spring Guide 并检查有关 @Id 注释以及如何使用它的部分。另外,请记住,在不查看您的数据库的情况下,数据库已经填充了该主键是可能的。我建议您在每次运行后添加一种方法来清除数据库或在内存中使用 H2。

【讨论】:

嗨@fjsventura,感谢您的回复。我刚刚添加了问题实体。是的,我会看看那些提到的参考资料。但是,如果您在查看 Entity 类后还有其他任何内容,请告诉我。【参考方案2】:

您似乎在此处明确覆盖了id prob.setPid(max);

这意味着 spring 不会自动生成下一个 id。导致违反主/外键约束。

【讨论】:

哦!有道理,谢谢!我有一个模糊的猜测可能是问题所在,但现在我明白了。你知道我该如何解决吗?我希望在表格中添加新问题。有点像将新问题附加到现有表中。 我建议删除该行并尝试它。我绝不是 spring 或 jpa 的专家。这是关于 id 生成的更好主题:***.com/questions/1817625/… 太棒了!这实际上奏效了。删除 @GeneratedValue 注释确实有效。非常感谢! 嗯,这有助于添加新行。但是当我删除现有行时,新添加的问题不会进入已删除的位置。我的意思是,如果我删除 id 为 1、2、3、4、5、6 中的 3 的问题,当我添加新问题时,它会变为 7 而不是 3。这意味着新的 id 是 1, 2,4,5,6,7。我尝试寻找解决方案,但没有找到任何合适的解决方案。有什么想法吗? 这是数据库排序工作的标准方式。它将使用序列中的下一个整数。例如最后 +1 。另外,我不是建议删除 @GeneratedValue 注释,而是删除 prob.setPid(max);【参考方案3】:

谢谢。查看实体和您的代码,我会说您使用的是The_Auto_Strategy,它将自动生成一个ID。您可以删除:

prob.setPid(max);

您的代码应该可以工作。 如果你想设置一个 ID,你应该使用:

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer pid;

【讨论】:

以上是关于具有该 ID 的元素已存在于数据库中的主要内容,如果未能解决你的问题,请参考以下文章

ADO.NET:使用 id 检查名称是不是已存在于数据库中

如何查找 jQuery 中是不是存在具有特定 id 的 div?

如何在更新期间检查该数据是不是已存在于数据库中(Mongoose And Express)

jQuery替换已存在于元素element上的事件event

如果 URL 已存在于数据库中,如何使用 PHP 检查?

ASP.NET 身份:尝试添加具有现有 ID 的用户