【问题标题】:How to delete a row having a foreign key in hibernate?如何在休眠中删除具有外键的行?
【发布时间】:2017-12-11 16:05:27
【问题描述】:

我有两个表,分别名为 usersroles。用户只能拥有一个角色。 我想要做的是按 id 删除用户。但我收到以下错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`supermarket`.`users`, CONSTRAINT `FKcogjq1smjy03v5s2wfegritx6` FOREIGN KEY (`role_id`) REFERENCES `Roles` (`role_id`))

据我了解,我删除了用户中具有外键的行。但我不知道如何删除roles 表中的行,然后才删除users 表中的记录。如何做到这一点只做一个查询?

以下是我的课程:

@Entity
public class Users {
private int userId;
private String login;
private String password;
private Roles roles;

public Users(String login, String password, Roles roles) {
    this.login = login;
    this.password = password;
    this.roles = roles;
}

public Users() {
}


@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "role_id")
public Roles getRoles() {
    return roles;
}

public void setRoles(Roles roles) {
    this.roles = roles;
}

 //getters and setters 

角色:

@Entity
public class Roles {
private int roleId;
private String roleName;

@Id
@Column(name = "role_id", nullable = false)
public int getRoleId() {
    return roleId;
}

public void setRoleId(int roleId) {
    this.roleId = roleId;
}

@Basic
@Column(name = "role_name", nullable = true, length = 14)
public String getRoleName() {
    return roleName;
}

public void setRoleName(String roleName) {
    this.roleName = roleName;
}

}

我是这样删除的:

 public void deleteCasher(int id) {

    Session session = sessionFactory.openSession();
    Query query = session.createQuery("from Users where userId=:id")
            .setParameter("id", id);

    Users user = (Users) query.uniqueResult();

    session.beginTransaction();
    session.delete(user);
    session.getTransaction().commit();
    session.close();


}

那么,我做错了什么?如何删除用户,同时删除role,进行一次查询?

【问题讨论】:

  • 我认为您的示例代码有误。此代码将正确删除用户。
  • 感谢回复,但我的用户表有外键。这就是我得到异常的原因。
  • Delete from users u where u.userid=1 , this query delete use rand execute 正确,我不知道你为什么说得到这个异常?我认为当删除角色时你会得到这个异常

标签: mysql spring hibernate


【解决方案1】:

如果您希望该行为成为永久,这意味着每次删除用户时,您都可以在创建表后更改 外键 操作。这直接进入MySQL,跟随this answer

将约束从ON DELETE RESTRICT更改为ON DELETE CASCADE

ALTER TABLE `users` DROP FOREIGN KEY `FKcogjq1smjy03v5s2wfegritx6`; 

ALTER TABLE `users` ADD CONSTRAINT `FKcogjq1smjy03v5s2wfegritx6`
  FOREIGN KEY (`role_id`) REFERENCES `Roles` (`role_id`)
  ON DELETE CASCADE; 

【讨论】:

    【解决方案2】:

    可能的原因--

    1-- 创建用户时,如果您在角色表中使用相应的用户 ID 创建角色

    2-- 如果您在其他表中使用用户标识作为 FOREIGN KEY....

    【讨论】:

      猜你喜欢
      • 2021-11-01
      • 1970-01-01
      • 2012-08-21
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多