Spring MVC не может удалить родительскую строку? - PullRequest
0 голосов
/ 28 июня 2019

я начал учить весенний мвк. Я делал некоторые практики, и я столкнулся с логической ошибкой. В моем примере у меня есть 2 класса сущности весной MVC. Там мой код school_ıd - это первичный ключ. Когда я пытался удалить школу из списка школ, я выдавал ошибку вроде этой

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails

Начальная школа:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="school_id")
private int schoolId;


@Column(name="school_name")
private String schoolName;


public int getSchoolId() {
    return schoolId;
}


public void setSchoolId(int schoolId) {
    this.schoolId = schoolId;
}


public String getSchoolName() {
    return schoolName;
}


public void setSchoolName(String schoolName) {
    this.schoolName = schoolName;
}       

Entity Student

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private int id;


@Column(name="first_name")
private String firstName;

@Column(name="last_name")
private String lastName;


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

@OneToOne
@JoinColumn(name="school_id")
private School school;



public School getSchool() {
    return school;
}

public void setSchool(School school) {
    this.school = school;
}

public int getId() {
    return id;
}

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

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

Метод удаления школьного контроллера:

  @GetMapping("/deleteSchool")
  public String deleteSchool(@RequestParam("schoolID") int 
  theSchoolId) {    
    schoolService.deleteSchool(theSchoolId);
    return "redirect:/school/list";
   }

Метод удаления SchoolDAOImpl:

@Override
    public void deleteSchool(int theSchoolId) {
        Session currentSession=sessionFactory.getCurrentSession();
        Query theQuery=currentSession.createQuery("delete from School where id=:schoolID");
        theQuery.setParameter("schoolID", theSchoolId);
        theQuery.executeUpdate();

    }

На самом деле, сейчас проблема в том, что я пытаюсь удалить школу, в школе есть по крайней мере 1 ученик, из-за чего я не могу удалить школу. Для этого сначала мне нужно удалить ребенка, в этом примере ребенок - студент после удаления родителя (школа) Но я думаю, что мой сценарий не доступен для этого. Пожалуйста, помогите мне, что я должен делать?

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Вы должны удалить ограничение целостности любой используемой вами БД, или вы должны сначала удалить дочерний, а затем родительский, или вы можете посмотреть каскадное правило этого в hibernate https://thoughts -on-java.org. / спящий-советы-как-на-удаление-ребенок-объекты /

0 голосов
/ 28 июня 2019

Сначала вы можете обновить Студента:

@Override
public void deleteSchool(int theSchoolId) {
    Session currentSession=sessionFactory.getCurrentSession();

    Query updateStudentQuery=currentSession.createQuery("Update Student s SET s.school = null WHERE s.school.schoolId = :schoolId");
    updateStudentQuery.setParameter("schoolID", theSchoolId);
    updateStudentQuery.executeUpdate();

    Query theQuery=currentSession.createQuery("delete from School where id=:schoolID");
    theQuery.setParameter("schoolID", theSchoolId);
    theQuery.executeUpdate();

}

или обновите с помощью DAO Stundent, а затем выполните запрос на удаление школы.

Я не смог проверить, поэтому я не знаю, работает ли он "WHERE s.school.schoolId =: schoolId" или вам нужно сделать где с подзапросом. Если не работает, попробуйте выполнить собственный запрос:

Query updateStudentQuery=currentSession.createNativeQuery("sql here");

Вместо

Query updateStudentQuery=currentSession.createQuery("Update Student s SET s.school = null WHERE s.school.schoolId = :schoolId");

Кроме того, если вы хотите сделать отношение двунаправленным, добавьте это в School Entity:

@OneToOne(mappedBy = "school")
private Student student;

Кстати, я думаю, что отношение @ManyToOne, а не @OneToOne, не так ли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...