【问题标题】:SQL Error: 1452, SQLState: 23000 | Cannot add or update a child row: a foreign key constraint failsSQL 错误:1452,SQL 状态:23000 |无法添加或更新子行:外键约束失败
【发布时间】:2015-12-06 22:40:57
【问题描述】:

我使用 spring、hibernate 和 mysql 创建了一个 web 应用程序。我有两个表用户,user_role。 user 表中的用户名是唯一的,在 user_role 表中它是一个外键。

当我尝试在 user_role 表中插入数据时,出现以下异常。但我可以在 mysql 中手动插入记录。

当我将用户名作为用户表中的主键时,它工作得很好。将用户名更改为唯一并将 user_id 更改为主要后,我收到此异常(请参阅下面的表结构)

@Override
public boolean addProfile(User user) {
    UserRole userRole = new UserRole();
    userRole.setRole("ROLE_USER");
    userRole.setUser(user);

    boolean status = false;
    try {
        this.sessionFactory.getCurrentSession().save(user);
        this.sessionFactory.getCurrentSession().save(userRole); //getting exception here
        status = true;

我在保存userRole. this.sessionFactory.getCurrentSession().save(userRole) 时遇到以下异常;

例外

调试:org.hibernate.engine.jdbc.spi.SqlExceptionHelper - 不能 执行语句 [n/a] com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: 无法添加或更新子行:外键约束失败 (mydb.user_role, 约束fk_user_user_role_username 外国 KEY (username) 参考 user (username) ON 删除 无操作 ON 更新无操作)

警告:org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL 错误: 1452,SQL 状态:23000 错误: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - 无法添加或 更新子行:外键约束失败 (mydb.user_role, 约束fk_user_user_role_username 外国 KEY (username) 参考 user (username) ON 删除 无操作 ON 更新无操作)错误:com.javaworkspace.nn.dao.impl.RegisterDAOImpl - org.hibernate.exception.ConstraintViolationException:无法执行语句 DEBUG: org.hibernate.engine.transaction.spi.AbstractTransactionImpl - 提交

用户表

user_id int(11) NO  PRI     auto_increment
username    varchar(100)    NO  UNI     
password    varchar(60) NO  

用户角色表

user_role_id    int(11) NO  PRI     auto_increment
username    varchar(100)    NO  MUL     
role    varchar(45) NO  

User.java

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_id", unique = true, nullable = false)
private String userId;

@Column(name = "USERNAME", unique = true, nullable = false, length = 100)
private String username;

UserRole.java

@Entity
@Table(name = "user_role", catalog = "mydb", uniqueConstraints = @UniqueConstraint(columnNames = {
        "role", "username" }))
public class UserRole {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "user_role_id", unique = true, nullable = false)
private Integer userRoleId;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "username", nullable = false)
private User user;

@Column(name = "role", nullable = false, length = 45)
private String role;

【问题讨论】:

    标签: mysql spring hibernate constraints sqlexception


    【解决方案1】:

    我找到了解决办法

    因为我映射了一个指向唯一键的外键。我们需要告诉 Hibernate 您所指的用户列(如果它不是主键)。为此,我们必须在第二个实体中添加 referencedColumnName:

    为了解决这个问题,我在 UserRole.java 中添加了 referencedColumnName = "username"

    UserRole.java

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "username", nullable = false, referencedColumnName = "username")
    private User user;
    

    【讨论】:

      猜你喜欢
      • 2015-08-07
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 2015-02-04
      • 2013-06-11
      • 2019-03-29
      • 2018-05-14
      • 2013-05-11
      相关资源
      最近更新 更多