2010-02-01 17 views
10

tengo este tipo de entidades:entidad eliminados pasó a persistir excepción

Documento | n .. a ..1 | DocumentType | 1 .. a .. n | Tipo de propiedad | 1 .. a .. n | DocumentProperty

simplemente tratar de eliminar un documento como: EntityManager.remove (documento);

pero un error está disparando:

16: 45: 51 499 ERROR [[Seam Recursos Servlet]] Servlet.service() para servlet Seam Recursos Servlet lanzó excepción javax.persistence.EntityNotFoundException: suprimido entidad pasó a persistir: [up.docstore.PropertyType #]

El problema parece venir de aquí:

@OneToMany(mappedBy = "documentType", cascade = {CascadeType.ALL}, fetch = FetchType.EAGER) 
@ForeignKey(name = "FK_DOCUMENT_TYPE__PROPERTY_TYPE") 
@Sort(type = SortType.NATURAL) 
private SortedSet<PropertyType> propertyTypes = new TreeSet<PropertyType>(); 

Si elimino CascadeType.PERSIST todo está funcionando. Pero lo necesito allí y también lo necesito EAGERLY.

¿Alguien conoce otra solución?

Editar: eliminado cascada DELETE_ORPHAN, pero sigue siendo el mismo problema.

Respuesta

12

Solución:

  • Hubo un CascadeType.REMOVE en una relación @ManyToOne! Lo eliminó.

Por qué esta solución?

  • si desea eliminar un niño seguramente no quiere eliminar su padre porque no puede haber otros niños relacionados con ese padre.
+3

yup - eso estaba oculto para nosotros, porque no lo mostró;) – Bozho

0

Veo que está configurando el cascade en dos lugares: el @OneToMany y el @Cascade. Creo que esto puede ser un problema, si uno anula al otro ...


El error que está informando necesidad alguna más contexto a ser comprensible. "Eliminar una entidad ya eliminada" implica claramente dos operaciones ... Debe proporcionar detalles sobre el estado anterior, las operaciones y el estado posterior (con "estado", me refiero al estado en la base de datos ...).

+0

Hola, acaba de añadir la cascada DELETE_ORPHAN, sólo para superar con una solución, pero parece que no es el problema. De todos modos, hago una llamada de descanso simple a través de DELETE, envío una identificación del documento que se eliminará, por lo que ... un escenario muy simple. –

+0

de acuerdo con los documentos de hibernación (lazy para buscarlo ahora) el atributo '@ Cascade' se agrega al atributo JPA' cascade', no lo anula. – Bozho

+0

@Bozho Gracias por esta precisión, en teoría ;-). Ojalá alguien lo probara en la práctica, ¿tal vez Cristian? :-) – KLE

0

Parece que las opciones de Cascade están en alguna parte haciendo que el Gestor de Entidades piense que este objeto u otro objeto de la cadena necesita persistir cuando llame a em.remove (documento). Necesita más detalles ...

6

Supongo que ha llamado remove() en una de tipo PropertyType antes.Llamar remove() sólo para la entidad "raíz", y retire los demás con algo como:

document.getDocumentType().getPropertyTypes().remove(propertyType); 

y retener el DELETE_ORPHAN

Puede entonces, después de verificar que usted ha llamado no remove() manualmente en otra entidades, intente llamar:

document = entityManager.merge(document); 
entityManager.remove(document); 

para que el EntityManager vuelve a asociar el objeto con la primera sesión.

+0

Hola Bozho. Llamo eliminar SOLAMENTE al documento, y esperaba que el resto de las entidades se eliminen a través de cascada. Para llamar a document.getDocumentType(). GetPropertyTypes(). Remove (propertyType); Necesito hacer un foreach en el conjunto de propiedades, y cuando elimino uno, se dispara una excepción porque el número de tipos de propiedad no es el mismo ... –

+0

compruebe si no está llamando a eliminar en algún lugar;) luego vea mi actualización – Bozho

Cuestiones relacionadas