2011-10-08 20 views
15
@Entity 
public class Report extends Model { 

    public Date date; 
    public double availability; 

    @ElementCollection 
    @Cascade(value={CascadeType.ALL}) 
    public Map<FaultCategory, Integer> categories;  
} 

En uno de mis trabajos Tengo el siguiente código:¿Cómo puedo eliminar en cascada una colección que es parte de una entidad jpa?

int n = MonthlyReport.delete("date = ?", date); 

Esto siempre no puede eliminar la entidad con el siguiente error:

The DELETE statement conflicted with the REFERENCE constraint "FK966F0D9A66DB1E54". The conflict occurred in database "TFADB", table "dbo.MonthlyReport_categories", column 'MonthlyReport_id'.

¿Cómo puedo especificar el mapeo por lo que la los elementos de la colección de categorías se eliminan cuando se elimina el informe?

+0

JPA no admite eliminaciones en cascada en elementcollections (consulte también [aquí] (http://stackoverflow.com/q/3903202/741249)) – THelper

Respuesta

26

La eliminación en cascada (y las operaciones en cascada en general) es efectiva solo cuando la operación se realiza a través de EntityManager. No cuando la eliminación se realiza como eliminación masiva a través de la consulta JP QL/HQL. No puede especificar la asignación que cadena de eliminación a los elementos en ElementCollection cuando la eliminación se realiza a través de consulta.

ElementCollection anotación no tiene atributo de cascada, porque las operaciones siempre están en cascada. Cuando elimina su entidad a través del EntityManager.remove(), la operación se conecta en cascada al ElementCollection.

Tienes que buscar todas las entidades MonthlyReport que quieras eliminar y llamar al EntityManager.remove para cada una de ellas. Parece que en lugar de esto en Play framework también puede llamar a delete-method en entity.

+0

Entonces, ¿cuál sería la forma correcta de eliminar las categorías? Me he dado cuenta de que si configuro la clave foránea en cascada en la base de datos, MonthyReport.delete realmente tiene éxito. – emt14

+0

Agregado a la respuesta, simplemente tráigalos con su fecha =? -criterios y eliminar/eliminar uno por uno. Luego, se eliminará en cascada a las categorías. –

+0

Eso hizo el truco muy bien. Gracias. – emt14

Cuestiones relacionadas