无法删除或更新父行 ConstraintViolationException
Cannot delete or update a parent row ConstraintViolationException
我有 2 个对象实体(用户和 Phone),它们应该具有多对多关系。
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;
现在,我在我的 USER table 中添加了 ID 为 1 和 2 的 2 个用户。
然后,我添加一个 ID 为 1 的 phone 并将它们映射到两个用户 ID(1&2)。
我的 USER_PHONE table 如下所示:
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;
}
知道我哪里出错了吗?
非常感谢 :)
进行以下更改。
//User class
@ManyToMany(cascade = {CascadeType.MERGE,CascadeType.REMOVE}, fetch = FetchType.EAGER)
...
private List<Phone> phones;
尝试使用 entityManager.createNativeQuery()
。您不能使用 createQuery()
,因为 table 应该作为一个实体出现在您的 Java 代码中。此外,您需要使用准确的 SQL 格式。
String query = "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 个对象实体(用户和 Phone),它们应该具有多对多关系。
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;
现在,我在我的 USER table 中添加了 ID 为 1 和 2 的 2 个用户。 然后,我添加一个 ID 为 1 的 phone 并将它们映射到两个用户 ID(1&2)。
我的 USER_PHONE table 如下所示:
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;
}
知道我哪里出错了吗? 非常感谢 :)
进行以下更改。
//User class
@ManyToMany(cascade = {CascadeType.MERGE,CascadeType.REMOVE}, fetch = FetchType.EAGER)
...
private List<Phone> phones;
尝试使用 entityManager.createNativeQuery()
。您不能使用 createQuery()
,因为 table 应该作为一个实体出现在您的 Java 代码中。此外,您需要使用准确的 SQL 格式。
String query = "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()
)