2014-06-16 5 views
0

J'ai une des entités JPA comme celui-ci:cascade Supprimer accroche dans JPA quand un grand nombre d'objets

@Entity 
class MyEntity{ 
    @JsonIgnore 
@OneToMany(mappedBy = "application", cascade = ALL, fetch = LAZY) 
private List<MyChildEnity> myChildEntities; 
} 
... 
@Entity 
class MyChildEnity { 
    @ManyToOne(optional = false, fetch = FetchType.LAZY, cascade = { REFRESH, 
     DETACH }) 
@JoinColumn(name = "APPLICATION_ID") 
private MyEntity application; 
} 

-je accéder à cette entité d'un appel REST. Lorsque le nombre d'éléments est très important et que j'essaie de supprimer l'objet MyEntity, l'appel REST se bloque puis expire. Pour un petit nombre d'éléments dans la table MyChildEnity, cela fonctionne correctement. Quand j'ai débogué, j'ai vu que JPA récupère un enregistrement à la fois et le supprime. C'est trop lent et trop de travail fait.

Est-ce un comportement normal? JPA ne devrait pas être intelligent pour convertir cela en un seul appel DELETE sur la table MyChildEnity. J'utilise OpenJPA avec Derby et base de données DB2.

+0

Suggérez de publier le code SQL invoqué et de déterminer à quoi chacun correspond. par exemple 1 SQL pour retirer les éléments de la Liste, puis 1 SQL pour retirer d'autres champs de l'enfant ??? Si oui, quels champs? –

+0

Oui ... D'abord il y a un SELECT pour obtenir tous les éléments et ensuite un appel DELETE pour chaque entrée dans cette liste –

Répondre

0

La raison pour laquelle vous obtenez une instruction delete pour chaque élément a probablement quelque chose à voir avec le fait que JPA vous permet de faire quelque chose avant et après la suppression. Si vous écrivez un JPQL avec une instruction delete, vous pouvez contourner le mécanisme de rappel et supprimer tout dans une seule requête.

Documentation for entity listeners and callbacks. (Fonctionnalité JPA).

+0

Merci .. cela a aidé –