Нарушение уникального индекса или первичного ключа: «ПЕРВИЧНЫЙ КЛЮЧ ДЛЯ PUBLIC.STUDENT(STUDENT_ID) [0, NULL, NULL]»; Оператор SQL:

#java #spring-boot #hibernate

#java #весенняя загрузка #спящий режим

Вопрос:

Получение ошибки ниже при попытке вставить объект Student с помощью метода REST Post

2020-10-08 18:50:08.799 ОШИБКА 21708 — [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[ DispatcherServlet] : Servlet.service() для сервлета [DispatcherServlet] в контексте с path [] выдал исключение[Ошибка обработки запроса; вложенное исключение org.springframework.dao.DataIntegrityViolationException: не удалось выполнить инструкцию; SQL [n / a]; ограничение [«ПЕРВИЧНЫЙ КЛЮЧ ДЛЯ PUBLIC.STUDENT(STUDENT_ID) [0, NULL, NULL]»; Инструкция SQL: вставить в student (class_id, student_name,значения student_id) (?, ?, ?) [23505-200]]; вложенным исключением является org.hibernate.exception.ConstraintViolationException: не удалось выполнить инструкцию] с основной причиной

org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Нарушение уникального индекса или первичного ключа: «ПЕРВИЧНЫЙ КЛЮЧ ДЛЯ PUBLIC.STUDENT(STUDENT_ID) [0, NULL, NULL]»; Инструкция SQL: вставить в значения student (class_id, student_name, student_id) (?, ?, ?) [23505-200]

Application.properties:-

 spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.datasource.url=jdbc:h2:mem:testdb
hibernate.check_nullability=false
spring.jpa.hibernate.ddl-auto=create
  

Student.class

 @Entity(name = "STUDENT")
public class Student {

    @Id
    @Column(name = "Student_Id")
    private int studentID;

    @Column(name = "Student_Name")
    private String studentName;

    @ManyToOne(cascade = javax.persistence.CascadeType.ALL)
    @JoinColumn(name = "class_id", nullable = true)
    private Classs classs;

    public int getStudentID() {
        return studentID;
    }

    public void setStudentID(int studentID) {
        this.studentID = studentID;
    }

    public String getStudentName() {
        return studentName;
    }

    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }

    
    public Classs getClasss() {
        return classs;
    }

    public void setClasss(Classs studentClass) {
        this.classs = studentClass;
    }

}
  

Классы

 @Entity(name = "CLASSS")
public class Classs {

    @Id
    @Column(name = "Classs_Id")
    private int classsId;
    
    @Column(name = "Classs_Name")
    private String classsName;
    
    @OneToMany(fetch = FetchType.LAZY)
    private List<Student> students;

    public int getClasssId() {
        return classsId;
    }

    public void setClasssId(int classsId) {
        this.classsId = classsId;
    }

    public String getClasssName() {
        return classsName;
    }

    public void setClasssName(String classsName) {
        this.classsName = classsName;
    }

}
  

StudentService.class

 @Service
public class StudentService {

    @Autowired
    private StudentRepostry studentRepository;

    public List<Student> getAllStudents() {
        return studentRepository.findAll();
    }

    public Optional<Student> findById(Integer id) {
        return studentRepository.findById(id);
    }
    
    public Student insertStudent(Student student) {
        return studentRepository.save(student);
    }

    public Student updatingStudent(Student student) {
        return studentRepository.save(student);
    }

    public void deleteStudentById(int id) {
        studentRepository.deleteById(id);
        
    }
}
  

ClasssService.class

 @Service
public class ClasssService {
    
    @Autowired
    private ClasssRepository classsRepository;

    public Classs insertClass(Classs classs) {
        return classsRepository.save(classs);
    }
}
  

UniversityRegController.class

 @RestController
@RequestMapping("/university")
public class UniversityRegController {

    @Autowired
    private StudentService studentService;
    
    @Autowired
    private ClasssService classsService;

    @GetMapping("/students")
    public List<Student> getAllStudentsList() {
        return studentService.getAllStudents();
    }
    
    @GetMapping("/student/{id}")
    public Optional<Student> getStudentById(@PathVariable int id) {
        return studentService.findById(id);
    }

    @PostMapping("/registerStudent")
    public Student registerStudent(@RequestBody Student student) {
        return studentService.insertStudent(student);
    }
    
    @PostMapping("/registerClass")
    public Classs registerClass(@RequestBody Classs classs) {
        return classsService.insertClass(classs);
    }
    
    @PutMapping("/updateStudent")
    public Student updateStudent(@RequestBody Student student) {
        return studentService.updatingStudent(student);
    }
    
    @DeleteMapping("/deleteStudent/{id}")
    public void deleteStudentById(@PathVariable int id) {
        studentService.deleteStudentById(id);
    }
}
  

URI : http://localhost:8080/university/registerStudent
Метод REST POST:

 {
    "Student": 
            {     "Classs":
                            {
                                "classsId":108,
                                "classsName":"8th Class"
                            },
                "studentID": 11,
                "studentName": "Jasdfngid"
            }
}
  

Комментарии:

1. Вы указали Class_id с заглавной буквы в одном объекте, но не в другом

2. Спасибо, что указали на это. Я применил изменения. Но, похоже, проблема заключается в том, что я выполняю простой post-запрос через postman для создания записи объекта classs в таблице Classs, и он создает нулевые записи для этой записи в базе данных, а позже, если я снова выполняю метод post, он выдает вышеупомянутое исключение: уникальный индекс или первичный ключнарушение: «ПЕРВИЧНЫЙ КЛЮЧ ДЛЯ PUBLIC.CLASSS(CLASSS_ID) [0, NULL]»; Инструкция SQL: вставить в classs (classs_name, classs_id) значения (?, ?) [23505-200]

Ответ №1:

Вы пытались создать две строки с одним и тем же STUDENT_ID, который является ПЕРВИЧНЫМ КЛЮЧОМ (это означает, что он не может быть одинаковым в двух строках и не может быть нулевым)

Комментарии:

1. Нет, я не создаю две строки student с одинаковым STUDENT_ID . Я пытаюсь создать запись базы данных student и запись базы данных classs с помощью метода REST Post. Но получаю эту ошибку: — Нарушение уникального индекса или первичного ключа: «ПЕРВИЧНЫЙ КЛЮЧ ДЛЯ PUBLIC.STUDENT(STUDENT_ID) [0, NULL, NULL]»; Инструкция SQL: вставить в значения student (class_id, student_name, student_id) (?, ?, ?)

2. Вы действительно уверены в том, какие данные вы используете? Потому что «нарушение уникального индекса или первичного ключа» означает то, что я вам сказал. И «ПЕРВИЧНЫЙ КЛЮЧ ДЛЯ PUBLIC.STUDENT (STUDENT_ID)» означает, что у вас есть нарушение первичного ключа (либо NULL, либо дубликат), и проблема связана со столбцом STUDENT_ID. На самом деле это просто говорит о том, что «значение, которое вы указали для STUDENT_ID, равно нулю или дублируется» Попробуйте выполнить запрос в изолированной среде, и вы увидите, работает ли он. Если это так, то проблема в вашей программе

3. Похоже, проблема заключается в том, что я выполняю простой post-запрос через postman для создания записи объекта classs в таблице Classs, и он создает нулевые записи для этой записи в базе данных, а позже, если я снова выполняю метод post, он выдает вышеуказанное исключение с уникальным индексом или нарушением первичного ключа: «ПЕРВИЧНЫЙ КЛЮЧ ДЛЯ PUBLIC.CLASSS(CLASSS_ID) [0, NULL]»; Инструкция SQL: вставить в classs (classs_name, classs_id) значения (?, ?) [23505-200]

4. попробуйте распечатать значения полей (classs_name, classs_id) классов перед сохранением в базе данных. Каковы результаты? Вы можете сделать это в службе или контроллере