Mi base de datos se compone de dos tablas: Organisation y User , en una relación ManyToOne , donde una organización puede contener muchos usuarios.
Antes de compartir mi problema, aquí están mis entidades:
@Entity @Table(name = "organisation") public class OrganisationEntity { @Id @Column(name = "orga_id") @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @NotNull private String name; // Getters & Setters }-
@Entity @Table(name = "\"user\"") public class UserEntity { @Id @Column(name = "user_id") @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @NotNull private String email; @NotNull private String firstName; @NotNull private String lastName; @NotNull private String password; @ManyToOne(targetEntity = OrganisationEntity.class,cascade = CascadeType.ALL) @JoinColumn(name = "orga_id") private OrganisationEntity organisation; // Getters & Setters } Aquí está mi problema, cuando a dos usuarios se les asigna una organización con el mismo nombre, dicha organización se crea dos veces en la tabla Organisation con 2 ID diferentes. Deseo asignar el ID de una organización a un nuevo usuario si ya existe.
Entonces, si los usuarios U1 y U2 se crean con una organización llamada O1, ambos deben tener el mismo orga_id y solo se debe crear una entrada de organización en la base de datos.
¿Cómo se puede lograr eso? ¿Y qué falta en mi comprensión de Hibernate ?
A pedido , aquí está mi servicio que crea la UserEntity al registrarse el usuario:
@Override public UserInfo createUser(UserInfo newUser) { return mapper.map(userDao.save(mapper.map(newUser))); } Mapeo el objeto con Mapstruct a una UserEntity y lo envío a mi DAO para guardarlo en mi base de datos.
Asegúrese de no asignar una nueva instancia de Organisation cada vez que se cree un nuevo usuario, sino que primero consulte la base de datos para una organización existente por nombre y reutilice la entidad resultante para todos los usuarios relacionados si ya está allí. .
Además, en aras de la corrección, considere agregar una restricción UNIQUE a la columna organisation.name .
Dado que no desea organizaciones diferentes para diferentes usuarios, es mejor eliminar @GeneratedValue(strategy = GenerationType.AUTO) del atributo Id de OrganisationEntity . Esto evitaría crear más entradas de Organización en la base de datos.
También obtenga primero el objeto OrganisationEntity y asígnelo a UserEntity