I am trying to save a User Entity with Roles under it. It seems like since the roles do not have their user id foreign key set it fails to save, is there a way to tell jpa to set the role's user id after it saves the user but before it saves the user's roles? Or will I need to remove the cascade save, save the User, set the role user ids, and then save the roles manually?
import lombok.*;
import javax.persistence.*;
import java.sql.Timestamp;
import java.util.List;
@Entity
@Table(name = "USER")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long userId;
@JoinColumn(name = "userId", referencedColumnName = "userId")
@OneToMany(cascade=CascadeType.ALL)
private List<UserRoles> userRoles;
}
and roles:
import lombok.*;
import javax.persistence.*;
@Entity
@Table(name = "USER_ROLES")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class UserRoles {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long userRolesId;
@Column
private long userId;
@Column
private long roleId;
}
Error from calling UserRepository.save(user) when roles are present:
oracle.jdbc.OracleDatabaseException: ORA-02291: integrity constraint (APP_OWNER.SYS_C009043) violated - parent key not found
The SYS_C009043 constraint is a foreign key constraint in the USER_ROLES table requiring userId to exist in the USER table
CodePudding user response:
Try the following mapping instead:
@Entity
@Table(name = "USER")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long userId;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<UserRoles> userRoles;
}
@Entity
@Table(name = "USER_ROLES")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class UserRoles {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long userRolesId;
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "userId")
private User user;
@Column
private long roleId;
}