多对多三表关系 JPA



我无法正确定义USER,SOCIEDAD和AREAS之间的关系。

当我尝试保存用户时,它确实: 休眠:插入npro_usuarios(活动、email_usuario、fecha_ultimo_acceso、matricula_usuario、nombre_usuario、观察、usuario_modif、id_usuario(值 (?, ?, ?, ?, ?, ?, ?, ?( -- 这是正确的

但稍后尝试插入连接表(id_user、id_sociedad、id_area(

插入npro_usuarios_sociedades_areas (id_usuario, id_area( 值 (?, ?(

失败是因为它没有提供id_sociedad

ORA-01400:它无法插入 NULL ("NPROUSER"(。NPRO_USUARIOS_SOCIEDADES_AREAS"。ID_SOCIEDAD"(

定义中有什么问题?

用户:

@Entity
@Table(name = "NPRO_USUARIOS")
public class User implements Serializable {
private static final long serialVersionUID = -1330075515340995797L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="user_seq_gen")
@SequenceGenerator(name="user_seq_gen", sequenceName="TELCO_NPRO_USER_SEQ")
@NotNull
private int id_usuario;
@NotNull
private String nombre_usuario;
@ManyToMany(cascade = {CascadeType.REMOVE, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH })
@JoinTable(name = "NPRO_USUARIOS_SOCIEDADES_AREAS", joinColumns = @JoinColumn(name = "id_usuario"), inverseJoinColumns = @JoinColumn(name = "id_sociedad"))
private Set<Sociedad> listaSociedad;
@Transient
private String sociedades;
// Si el area es nula, el usuario estara asignado a todas las areas
@ManyToMany(cascade = {CascadeType.REMOVE, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH })
@JoinTable(name = "NPRO_USUARIOS_SOCIEDADES_AREAS", joinColumns = @JoinColumn(name = "id_usuario"), inverseJoinColumns = @JoinColumn(name = "id_area"))
private Set<Area> listAreas;
@Transient
private String areas;
@NotNull
private String matricula_usuario;
@NotNull
private String email_usuario;
@ManyToMany(cascade = { CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH })
@JoinTable(name = "NPRO_PERFILES_USUARIOS", joinColumns = @JoinColumn(name = "id_usuario"), inverseJoinColumns = @JoinColumn(name = "id_rol"))
private Set<Role> listaRoles;
@ManyToMany(cascade = { CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH })
@JoinTable(name = "NPRO_PERFILES_USUARIOS", joinColumns = @JoinColumn(name = "id_usuario"), inverseJoinColumns = @JoinColumn(name = "id_pantalla"))
private Set<Pantalla> listaPantallas;
private LocalDateTime fecha_ultimo_acceso;
private String observaciones;
@JsonIgnore
@ManyToOne
@JoinColumn(name = "usuario_modif")
private User usuario_modif;
}

公司:

@Entity
@Table(name = "NPRO_MAESTRO_SOCIEDADES")
public class Sociedad implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@NotNull
private int id_sociedad;
@NotNull
private String cod_sociedad;
@NotNull
private String cod_sociedad_gl;
@NotNull
private String nombre_sociedad;
@NotNull
private String cif_sociedad;
private String observaciones;
@JsonIgnore
@ManyToOne
@JoinColumn(name = "usuario_modif")
private User usuario_modif;
private String activo;
@JsonIgnore
@ManyToMany(cascade = {CascadeType.REMOVE, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH })
@JoinTable(name = "NPRO_USUARIOS_SOCIEDADES_AREAS", joinColumns = @JoinColumn(name = "id_sociedad"), inverseJoinColumns = @JoinColumn(name = "id_usuario"))
private Set<User> listaUsuarios;
}

面积:

@Entity
@Table(name = "NPRO_MAESTRO_AREAS")
public class Area implements Serializable {
private static final long serialVersionUID = -1330075515340995797L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="area_seq_gen")
@SequenceGenerator(name="area_seq_gen", sequenceName="TELCO_NPRO_AREAS_SEQ")
@NotNull
private int id_area;
@NotNull
private String nombre_area;
private LocalDateTime fecha_modif;
private String observaciones;
@JsonIgnore
@ManyToOne
@JoinColumn(name = "usuario_modif")
private User usuario_modif;
@NotNull
private String activo;
@ManyToOne
@JoinColumn(name="id_sociedad")
private Sociedad sociedad;
@JsonIgnore
@ManyToMany(cascade = {CascadeType.REMOVE, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH })
@JoinTable(name = "NPRO_USUARIOS_SOCIEDADES_AREAS", joinColumns = @JoinColumn(name = "id_area"), inverseJoinColumns = @JoinColumn(name = "id_usuario"))
private Set<User> listaUsuarios;
}

我正在使用弹簧引导 jpa 存储库保存方法

@Override
public User save(User user) {
return userRepository.save(user);
}

休眠将使用外键创建连接表,外键是连接表的键。因此,id 不能为空。如果你想要空值。我建议您创建关系实体并从连接表中将一对多映射