2015-09-10 2 views
0

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 , 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

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; 

Répondre

0

J'ai trouvé la solution

Depuis que je cartographié une clé étrangère qui pointe vers une clé unique. Nous devons informer Hibernate des colonnes Utilisateur auxquelles vous faites référence (si ce n'est pas une clé primaire). Pour ce faire, il faut ajouter referencedColumnName dans la seconde entité:

Pour résoudre le problème, j'ai ajouté referencedColumnName = "nom d'utilisateur" dans UserRole.java

UserRole.java

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