I have 3 entities Role, Users and UserAssignedRoles. I have OneToMany bidirectional relation between Users and UserAssignedRoles and Roles and UserAssigned Roles respectively. On firing the spring boot app, It throws an error
java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (examserver.user_assigned_roles, CONSTRAINT FKkh4a308jmt2dwrbmohjlsxbrd FOREIGN KEY (role_fk) REFERENCES roles (role_id))
can anyone help me pointing where I did wrong. the code of entities are here as follows.
Users.java
package com.examserver.entities;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.GetMapping;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Table(name = "USERS")
@Entity
@Getter
@Setter
@AllArgsConstructor
public class Users implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_id")
private int id;
@Column(name = "first_name")
private String fname;
@Column(name = "last_name")
private String lname;
@Column(name = "user_name")
private String username;
@Column(name = "Email")
private String email;
@Column(name = "Password")
private String password;
@Column(name = "Is_Profile_Active")
private boolean active = true;
@Column(name = "Contact_Number")
private String phoneNo;
@Column(name = "User_Description")
private String about;
@Column(name = "Profile_Image")
private String dp;
@OneToMany(mappedBy = "user",cascade = CascadeType.ALL,fetch = FetchType.EAGER)
@JsonIgnore
Set<UserAssignedRoles> usersList = new HashSet<>();
public Set<UserAssignedRoles> getUsersList() {
return usersList;
}
public void setUsersList(Set<UserAssignedRoles> usersList) {
this.usersList = usersList;
}
public Users() {
}
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Set<Authority> set = new HashSet<>();
this.usersList.forEach(userAssignedRoles ->
set.add(new Authority(userAssignedRoles.getRole().getRoleName())));
return set;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
and Role.java
package com.examserver.entities;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import java.util.Set;
@Table(name = "ROLES")
@Entity
@Setter
@Getter
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "Role_Id")
private int roleId;
@Column(name = "Role_Name")
private String roleName;
@OneToMany(mappedBy = "role",fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<UserAssignedRoles> userAssignedRolesSet;
public Set<UserAssignedRoles> getUserAssignedRolesSet() {
return userAssignedRolesSet;
}
public void setUserAssignedRolesSet(Set<UserAssignedRoles> userAssignedRolesSet) {
this.userAssignedRolesSet = userAssignedRolesSet;
}
public Role(){
}
public Role(int roleId, String roleName, Set<UserAssignedRoles> userAssignedRolesSet) {
this.roleId = roleId;
this.roleName = roleName;
this.userAssignedRolesSet = userAssignedRolesSet;
}
}
and UserAssignedRole.java
package com.examserver.entities;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
import java.util.List;
@Table(name = "USER_ASSIGNED_ROLES")
@Entity
@Getter
@Setter
public class UserAssignedRoles {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int userRoleId;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name ="Role_FK")
private Role role;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "User_FK")
private Users user;
}