es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problema de migración de Jpa habilitar la persistencia en cascada globalmente.

Se migró de jpa 1.x a jpa 2.x

Entidad de Usuario

Entidad
public class Usuario {
@OneToMany(fetch=FetchType.EAGER,
cascade=CascadeType.ALL)
private List<Direccion> direccionesUsuario = new ArrayList<>();
}

@Entity
public class Direcciones {
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="id_tipo_direccion")
private TipoDireccion tipoDireccion;
}

Cuando intenté guardar una dirección,

Obtuve el siguiente error:

However, this field does not allow cascade persist. You cannot flush unmanaged objects or graphs that have persistent associations to unmanaged objects.
Suggested actions:
a) Establezca el atributo de cascada para este campo como CascadeType.PERSIST o CascadeType.ALL (anotaciones JPA) o “persist” o “all” (JPA orm.xml),
b) habilitar la cascada-persistencia globalmente,
c) persistir manualmente el valor del campo relacionado antes de la limpieza.
d) Si la referencia pertenece a otro contexto, permita la referencia a él configurando StoreContext.setAllowReferenceToSiblingContext().

Obteniendo un error para el tipo de dirección.

Este error desaparecerá cuando agregue CascadeType.PERSIST.

Entidad
public class Direcciones {
@ManyToOne(fetch=FetchType.EAGER,
cascade=CascadeType.PERSIST)
@JoinColumn(name="id_tipo_direccion")
private TipoDireccion tipoDireccion;
}

Pero no quiero guardar el tipo de dirección. ¿Hay alguna otra solución para solucionar este problema?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Si no desea persistir la entidad AddressType al persistir la entidad Address, puede eliminar el atributo cascade de la anotación @ManyToOne. Esto le permitirá persistir una entidad Address sin persistir su entidad AddressType relacionada. Sin embargo, deberá asegurarse de que la entidad AddressType se persista por separado si es necesario.

    Alternativamente, puede establecer el atributo cascade en CascadeType.DETACH o CascadeType.MERGE si desea propagar solo cambios específicos realizados en la entidad Address a su entidad AddressType relacionada.

    Aquí hay un ejemplo de la entidad Addresses modificada con CascadeType eliminado:

    @Entity 
    public class Addresses { 
        @ManyToOne(fetch=fetchtype.EAGER)
        @JoinColumn(name="address_type_id")
        private AddressType addressType;
    }
    

Comments are closed.