我使用 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
, CONSTRAINTfk_user_user_role_username
FOREIGN KEY (username
) REFERENCESuser
(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
, CONSTRAINTfk_user_user_role_username
FOREIGN KEY (username
) REFERENCESuser
(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/