복붙노트

[SPRING] 부모 행을 삭제하거나 업데이트 할 수 없습니다. ConstraintViolationException

SPRING

부모 행을 삭제하거나 업데이트 할 수 없습니다. ConstraintViolationException

나는 2 개의 객체 엔티티 (User and Phone)를 가지고 있고 그것들은 many-to-many 관계를 가지고 있다고 가정한다.

User.java

//all columns

@ManyToMany(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
    @JoinTable(name = "USER_PHONE",
            joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "phone_id", referencedColumnName = "id"))
    private List<Phone> phones;

Phone.java

//all columns
@ManyToMany(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
    @JoinTable(name = "USER_PHONE",
            joinColumns = @JoinColumn(name = "phone_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"))
    private List<User> userList;

이제 ID 1과 ID 2 인 2 명의 사용자를 USER 테이블에 추가합니다. 그런 다음 ID가 1 인 단일 전화를 추가하고 두 사용자 ID (1 및 2)에 매핑합니다.

내 USER_PHONE 테이블은 다음과 같습니다.

Select * from USER_PHONE;
+----------+---------+
| phone_id | user_id |
+----------+---------+
|        1 |       1 |
|        1 |       2 |
+----------+---------+

이제 ID가 2 인 사용자를 삭제하고 싶습니다. 이 작업을 시도하면 오류가 발생합니다.

javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`dbname`.`USER_PHONE`, CONSTRAINT `FKC6A847DAFA96A429` FOREIGN KEY (`user_id`) REFERENCES `USER` (`ID`))

내 스크립트 삭제 :

  String query = "DELETE User where id=?1";
        try{
            Query q = entityManager.createQuery(query);
            q.setParameter(1,id);
            q.executeUpdate();
            System.out.println(System.currentTimeMillis() + " DELETE: userId " + id + " ==> deleted");
        } catch(Exception e){
            e.printStackTrace();
            return false;
        }

어떤 생각인지 내가 어디로 잘못 가고있어? 고마워요 :)

해결법

  1. ==============================

    1.entityManager.createNativeQuery ()를 사용해보십시오. Java 코드에서 테이블이 엔티티로 존재해야하므로 createQuery ()를 사용할 수 없습니다. 또한 정확한 SQL 형식을 사용해야합니다.

    entityManager.createNativeQuery ()를 사용해보십시오. Java 코드에서 테이블이 엔티티로 존재해야하므로 createQuery ()를 사용할 수 없습니다. 또한 정확한 SQL 형식을 사용해야합니다.

    문자열 쿼리 = "DELETE FROM USER_PHONE WHERE user_id =? 1";

        try{
            Query q = entityManager.createNativeQuery(query);
            q.setParameter(1,id);
            q.executeUpdate();
            System.out.println(System.currentTimeMillis() + " DELETE User_Phone: userId " + id + " ==> deleted");
        } catch(Exception e){
            e.printStackTrace();
            return false;
        }`
    

    먼저 USER_PHONE (createNativeQuery () 사용)에서 행을 삭제 한 다음 User (createQuery () 사용)에서 행을 삭제합니다.

  2. ==============================

    2.다음과 같이 변경하십시오.

    다음과 같이 변경하십시오.

    //User class
    @ManyToMany(cascade = {CascadeType.MERGE,CascadeType.REMOVE}, fetch = FetchType.EAGER)
    ...
    private List<Phone> phones;
    
  3. from https://stackoverflow.com/questions/40641181/cannot-delete-or-update-a-parent-row-constraintviolationexception by cc-by-sa and MIT license