#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) классов перед сохранением в базе данных. Каковы результаты? Вы можете сделать это в службе или контроллере