2009-12-28 10 views
1

L'objectif est de supprimer tous les dépendants lorsque leur propriétaire est supprimé. J'ai les classes suivantes:Comment puis-je spécifier une dépendance dans JPA sans liens de l'entité propriétaire?

@Entity 
class Dependent {  
    @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY, optional = false) 
    @Column(name = "OWNER") 
    private Owner _owner; 
} 

@Entity 
class Owner { 
... 
} 

Dans l'implémentation actuelle Dependent existe toujours après que son propriétaire a été supprimé. Le propriétaire n'a aucun lien vers Dependent et ne peut pas être modifié, donc je ne peux pas utiliser l'annotation @Dependent ou cascade = DELETE.

Est-ce que JPA supporte une telle "dépendance inverse"? Une autre question est qu'est-ce que optional = "false" garantit pendant que le champ _owner est supprimé?

Répondre

0

Vous avez deux options: Vous devez ajouter un sac/un ensemble/une liste à la classe Owner avec cascade-delete. Vous pouvez rendre ce sac paresseux et ne jamais y accéder, il n'aura donc aucun impact sur les performances jusqu'à ce que vous le supprimiez.

Votre autre option consiste à supprimer les instances Dependent avec une requête lorsque vous supprimez le propriétaire. Étant donné que JPA ne fait pas la récupération automatique des instances, vous devez commencer la suppression manuellement de toute façon, assurez-vous simplement que chaque utilise une seule fonction pour supprimer les propriétaires, puis ajoutez l'appel pour y supprimer les enfants.

+0

La classe Owner ne peut pas être modifiée. êtes-vous sûr que JPA ne fournit pas une option pour spécifier la dépendance dans la classe dépendante? alors qu'est-ce que "optional = 'false'" pour? – oakjumper

+0

'optional = false' déclare simplement quel côté est responsable du mappage; vous avez toujours besoin de la cartographie dans les deux classes. Si vous ne pouvez pas modifier la classe propriétaire, vous devez utiliser des requêtes natives et tout faire manuellement. Ne pas oublier de rincer les caches à chaque fois. –

+0

Votre problème est "La classe du propriétaire ne peut pas être modifiée". C'est le problème que vous devez résoudre. Vous devez décider s'il est plus complexe de modifier la classe propriétaire ou de passer quelques semaines à déboguer la solution de contournement. Ou peut-être vous pouvez mapper la classe propriétaire avec un fichier HBM. Si vous utilisez Spring, vous pouvez facilement mélanger des annotations avec l'ancienne configuration XML. –

0

Une façon de résoudre ce problème est d'utiliser une sous-classe qui partage les mêmes tables que celles du propriétaire et d'ajouter une collection qui pointe vers la personne à charge. Je ne suis pas d'accord avec le point d'Aaron Digulla sur 'optional = false', cette déclaration montre seulement que l'assocation est optionnelle, et parce que vous n'avez pas l'assocation bidrectionnelle, donc le Dependent gère toujours le mapping.