mysql - 无法删除或更新父行 ConstraintViolationException

标签 mysql spring hibernate spring-mvc foreign-key-relationship

我有 2 个对象实体(用户和电话),它们应该具有多对多关系。

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;

电话.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 表中添加了 ID 为 1 和 2 的 2 个用户。 然后,我添加一个 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;
        }

知道我哪里出错了吗? 非常感谢:)

最佳答案

尝试使用entityManager.createNativeQuery()。您不能使用createQuery(),因为表应该作为 Java 代码中的实体出现。另外,您需要使用精确的 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())

关于mysql - 无法删除或更新父行 ConstraintViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40641181/

相关文章:

java - 无法在JPA中进行子查询

sql - Hibernate 如何最好地处理关联表/外键?

Mysql嵌套查询访问父字段值

mysql - 无法检索sql语句中的行

php - 如何获取在其他页面上选择的值?

java - Spring Security 总是返回 HTTP 403

java - 如果单例不好!为什么spring bean默认是单调的

php - MySql 获取数组操作

java - WebSecurityConfig Java 相当于使用 spring-security.xml 完成的 spring LDAP 身份验证

java - 需要 Hibernate 中主键 @OneToOne 映射的示例