¿Por qué no va a JPA eliminar las entidades de propiedad cuando la entidad titular pierde la referencia a ellos?

StackOverflow https://stackoverflow.com/questions/1133179

  •  16-09-2019
  •  | 
  •  

Pregunta

Tengo una entidad "Solicitud" de la APP, que posee una lista de respuestas (también entidades JPA). Así es como se define en Request.java:

@OneToMany(cascade= CascadeType.ALL, mappedBy="request")
private List<Answer> answerList;

Y en Answer.java:

@JoinColumn(name = "request", referencedColumnName="id")
@ManyToOne(optional = false)
private Request request;

En el curso de la ejecución del programa, de la lista de peticiones de respuestas pueden tener respuestas añadido o eliminado de él, o el objeto de lista actual puede ser reemplazado. Mi problema es así: cuando puedo combinar una petición a la base de datos, los objetos de respuesta que utilizan para estar en la lista se mantienen en la base de datos - es decir, objetos respuesta que la solicitud ya no pueda no se eliminan referencia a (indirectamente, a través de una lista).

Este no es el comportamiento que deseo, como si fusionar una solicitud a la base de datos, y luego traerlo de nuevo, la lista de respuestas no puede ser el mismo. Estoy haciendo un error de programación? ¿Hay una anotación o ajuste que se asegurará de que las respuestas en la base de datos son exactamente las respuestas en la Solicitud de Lista?

Una solución es mantener las referencias a lista de respuestas original y luego utilizar el EntityManager para quitar cada respuesta de edad antes de la fusión de la solicitud, pero parece que no debe haber una forma más limpia.

¿Fue útil?

Solución

En JPA 1.0, lo que quiere hacer no se puede hacer por la APP. Simplemente, toda la gestión de relaciones debe ser realizada por la aplicación, incluyendo la eliminación de todos los huérfanos de las colecciones (que es lo que estamos tratando de hacer).

En JPA 2.0, que hacen de soporte (aunque no sé los detalles), pero dependiendo de su aplicación, una actualización no puede ser fácil o posible.

También puede usar algo como Hibernate directamente, pero aún así utilizar muchos JPA 1.0 anotaciones, etc. No puedo dar detalles sobre eso tampoco.

En mi caso he escrito código genérico para manejar la fusión de las colecciones de forma automática a través de la reflexión.

Otros consejos

El uso de EclipseLink y poniendo anotación @PrivateOwned a AnswerList ayudaría.

Es ilegal para especificar propiedades adicionales en relación asignada. Puede utilizar la anotación @DependentElement Solicitar una vez.

Si utiliza Hibernate como proveedor JPA, se podría añadir un

@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)

en el AnswerList. Esto funcionaría además de las anotaciones JPA que utiliza ya. JPA 2 (la mayoría / todos los proveedores de la APP no tienen una aplicación preparada la producción en este momento) puede hacer esto por su cuenta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top