[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.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.다음과 같이 변경하십시오.
다음과 같이 변경하십시오.
//User class @ManyToMany(cascade = {CascadeType.MERGE,CascadeType.REMOVE}, fetch = FetchType.EAGER) ... private List<Phone> phones;
from https://stackoverflow.com/questions/40641181/cannot-delete-or-update-a-parent-row-constraintviolationexception by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 나는지도의지도가있는 봄 속성 파일을 읽고 싶다. (0) | 2019.02.27 |
---|---|
[SPRING] 주석 통합 코드를 사용하는 Spring Integration Executor 채널 (0) | 2019.02.27 |
[SPRING] JSP 페이지 인코딩 문제 (0) | 2019.02.27 |
[SPRING] ClassNotFoundException : javax.validation.ValidatorFactory (0) | 2019.02.27 |
[SPRING] 런타임시 스프링 웹 애플리케이션의 특성 파일 겹쳐 쓰기 (0) | 2019.02.27 |