I'm triying to save a user class with company and areas selected. User has a many to many relation with company and many to many to areas. It's giving me the error : detached entity passed to persist:
I'm not sure what is the problem
USER:
@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.PERSIST,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.PERSIST,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;
}
Compnay:
@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.PERSIST,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;
}
Area:
@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.PERSIST,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;
}
I'm using springboot jpa repository save method
@Override
public User save(User user) {
return userRepository.save(user);
}
And this is the complete error : 2020-06-09 15:49:02.371 [nio-8080-exec-4] .m.m.a.ExceptionHandlerExceptionResolver : Resolved exception caused by Handler execution: org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: com.telefonica.npro.model.Area; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: com.telefonica.npro.model.Area
Thanks in advance
EDIT :
I'm reading about the eror in this page http://knowledgespleasure.blogspot.com/2015/06/understand-detached-entity-passed-to.html
And I guess my problem is the last one :
On the other hand, if requirement is never to add a new child if its not alredy in DB then CascadeType.PERSIST should be removed and cascade={CascadeType.MERGE,CascadeType.REFRESH} should be used
User is always related with the company and areas, and they already exist, they are not going to be new. But if I remove PERSIST, it's triying to insert in an id null in the commun table NPRO_USUARIOS_SOCIEDADES_AREAS
Any help ?