J'ai créé une application Web en utilisant spring, hibernate et mysql. J'ai deux tables utilisateur, user_role. nom d'utilisateur dans la table utilisateur est unique et dans la table user_role c'est une clé étrangère.Erreur SQL: 1452, SQLState: 23000 | Impossible d'ajouter ou de mettre à jour une ligne enfant: une contrainte de clé étrangère échoue
Lorsque j'essaie d'insérer des données dans la table user_role, j'obtiens l'exception ci-dessous. Mais je suis capable d'insérer des enregistrements manuellement dans mysql.
Cela a fonctionné parfaitement lorsque j'avais un nom d'utilisateur comme clé primaire dans la table utilisateur. Après avoir changé le nom d'utilisateur unique et user_id à première je reçois cette exception (voir la structure de tableau ci-dessous)
@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;
Je reçois l'exception suivante tout en économisant l'userRole. this.sessionFactory.getCurrentSession().save(userRole)
;
Exception
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
table utilisateur
user_id int(11) NO PRI auto_increment
username varchar(100) NO UNI
password varchar(60) NO
tableau 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;