Tengo dos clases de entidad Organización y Usuario con una relación de uno a muchos ( ¡Código Groovy para simplificar! ):
@Entity class Organisation { @Id Long id String name @OneToMany List<User> users } @Entity class User { @Id Long id String username @ManyToOne(optional=false, cascade = CascadeType.Persist) Organisation organisation }Cuando creo un nuevo usuario con una nueva organización todo funciona bien:
def user = new User(organisation: new Organisation(...))Pero cuando tomo una organización existente, la configuro en el atributo de organización para un nuevo usuario, aparece un error:
def user = new User(organisation: organisationRepository.findOne(orgId)) userRepo.save(user)Resultará en:
org.hibernate.PersistentObjectException: entidad separada pasada para persistir: Organización
Sé que no se puede llamar a persistir en una entidad separada. Pero en ese caso, dado que no cambio nada en la entidad de la organización en sí, pensé que hibernate lo permitiría.
Traté de poner cascade = {CascadeType.Persist, CascadeType.Merge} en la anotación ManyToOne , pero termina con el mismo error.
¿Lo que quiero archivar no es posible con hibernate o tengo un error de pensamiento en alguna parte?
Ibas en la dirección correcta con:
cascade = {CascadeType.Persist, CascadeType.Merge} El problema es que cuando aún realiza la operación de save , el proveedor de persistencia intenta conectar en cascada la operación de persist , por lo que termina intentando persistir en la entidad de la Organización que ya tiene un @Id configurado y está desconectado.
Lo que tendría que hacer es merge en lugar de save .
En ese caso, la nueva entidad persistirá y la Organización se fusionará nuevamente en el contexto de persistencia, lo que permitirá que toda la operación sea exitosa.
Solo tenga en cuenta que cuando use la combinación y desee realizar operaciones en la entidad pasada después, deberá asignar el resultado a una nueva variable y realizar la operación en ella fe:
User mergedUser = userRepo.merge(user); // operations on mergedUser from now on