mysql - SQL 错误 : 1452, SQL 状态:23000 |无法添加或更新子行:外键约束失败

标签 mysql spring hibernate constraints sqlexception

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

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

当我将用户名作为用户表中的主键时,它工作得很好。将用户名更改为 unique 并将 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);

异常

DEBUG: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - could not execute statement [n/a] com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (mydb.user_role, CONSTRAINT fk_user_user_role_username FOREIGN KEY (username) REFERENCES user (username) ON DELETE NO ACTION ON UPDATE NO ACTION)

WARN : org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 1452, SQLState: 23000 ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Cannot add or update a child row: a foreign key constraint fails (mydb.user_role, CONSTRAINT fk_user_user_role_username FOREIGN KEY (username) REFERENCES user (username) ON DELETE NO ACTION ON UPDATE NO ACTION) ERROR: com.javaworkspace.nn.dao.impl.RegisterDAOImpl - org.hibernate.exception.ConstraintViolationException: could not execute statement DEBUG: org.hibernate.engine.transaction.spi.AbstractTransactionImpl - committing

用户表

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

user_role 表

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;

最佳答案

我找到了解决办法

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

为了解决该问题,我在 UserRole.java 中添加了referencedColumnName =“username”

UserRole.java

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

关于mysql - SQL 错误 : 1452, SQL 状态:23000 |无法添加或更新子行:外键约束失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32505343/

相关文章:

mysql case 语句无法创建新列

java - 使用 Spring Data Mongodb 进行地理空间查询

java - org.hibernate.MappingException : Unable to find column with logical name Id

hibernate - 如何在 hibernate 标准投影中进行划分(column1/column2)

php - 无法使用常量链接图像

php - CodeIgniter 使用 if 来显示一些表格

javascript - 使用 jquery 和 php 更新数据库

Java hibernate如何持久保存没有关系的实体列表?

spring - 如何获取距离 - MongoDB 模板 Near 函数

java - 想要使用实体修改 Hibernate 条件