gpt4 book ai didi

java - 使用 Postgres 获取 "Duplicate key value violates unique constraint"

转载 作者:行者123 更新时间:2023-12-01 19:22:44 24 4
gpt4 key购买 nike

我正在开发 Springboot 应用程序。


问题陈述:
我正在使用序列来生成id。当我第一次点击 Controller 时,没有任何异常,并且数据已成功保存到数据库中。
但是当我第二次点击 Controller 时,我得到:

**duplicate key violates unique constraint, Detail: 
Key(id)=(100) already exits.** <br/>

但是 id = 100 之前已经插入了 10 条记录。

我有以下 POJO:

package com.example.demo;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "student_tbl", schema = "user")
public class Student {

@Id
private Integer id;
private String name;
private String className;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getClassName() {
return className;
}

public void setClassName(String className) {
this.className = className;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

}

学生存储库

package com.example.demo;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

public interface StudentRepository extends JpaRepository<Student, Integer> {

@Query(value = "select nextval('user.student_id')", nativeQuery = true)
Integer createId();

}

坚持学生

package com.example.demo;

import java.util.List;
import java.util.stream.IntStream;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class PersistStudent {

@Autowired
private StudentRepository studentRepository;

@PersistenceContext
EntityManager entityManager;

@Transactional
public void persistStudent(List<Student> students) {

try {

IntStream.range(0, students.size()).forEach(index -> {
if (students.size() == index || index % 100 == 0) {
entityManager.flush();
entityManager.clear();
}

entityManager.persist(students.get(index));
});
} catch (Exception e) {
System.out.println("Exception:: " + e);
}
}

}

Controller

package com.example.demo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class StudentContoller {

@Autowired
private PersistStudent persistStudent;

@Autowired
private StudentRepository studentRepo;

@GetMapping(value = "/save")
public void saveStudent() {

List<Student> students = new ArrayList<Student>();
Student stu = new Student();
stu.setClassName("VII");
stu.setName("John Doe");
stu.setId(studentRepo.createId());

students.add(stu);

persistStudent.persistStudent(students);
}

}

请帮忙。

最佳答案

您可以通过简单地使用 @Generate 注释字段 Student.id 来避免管理实体 id 的全部开销。这样,您只需将 id 字段留空,然后在插入时就会为该实体分配一个唯一的 id。我还建议使用 JpaRepository 中的方法进行创建/读取/更新/删除操作。

代码将变成:

@Entity
@Table(name = "student_tbl", schema = "user")
public class Student {

@Id
@Generated
private Integer id;
private String name;
private String className;

...

@Service
public class PersistStudent {

@Autowired
private StudentRepository studentRepository;

@Transactional
public void persistStudent(List<Student> students) {
studentRepository.saveAll(students);
}
}

...

@RestController
public class StudentContoller {

@Autowired
private PersistStudent persistStudent;

@GetMapping(value = "/save")
public void saveStudent() {

List<Student> students = new ArrayList<Student>();
Student stu = new Student();
stu.setClassName("VII");
stu.setName("John Doe");
students.add(stu);

persistStudent.persistStudent(students);
}

}

关于java - 使用 Postgres 获取 "Duplicate key value violates unique constraint",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59342279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com