2010-03-19 67 views
1

J'ai un problème avec JPA (EclipseLink). Je ne suis pas en mesure de supprimer une table d'association. Telle est la situation:La table d'association JPA n'est pas supprimable

  • Produit 1: n à ProductResource
  • Ressource 1: n à ProductResource

j'ai mis les produits et les attributs de ressources ProductResource. Si j'essaie ensuite de supprimer l'objet ProductResource, rien ne se passe (aucun sql n'est généré - aucune exception). Si je commente les deux annotations OneToMany dans ProductResource, je peux supprimer l'objet. Je peux également supprimer l'objet lorsque les attributs de produit et de ressource ne sont pas définis. Si je ne commente que l'annotation au-dessus de l'attribut de ressource, l'objet ProductResource est supprimé lors de la suppression de l'objet produit (cascade = CascadeType.ALL). J'espère que quelqu'un pourrait me donner un indice. Je vous remercie.

ressources du produit:

public class ProductResource implements Serializable { 
@ManyToOne(fetch=FetchType.EAGER, cascade=CascadeType.MERGE) 
private Product product; 

@ManyToOne(fetch=FetchType.EAGER, cascade=CascadeType.MERGE) 
private Resource resource; 

Produit:

public class Product implements Serializable { 

@OneToMany(mappedBy="product", fetch=FetchType.EAGER, cascade=CascadeType.ALL) 
private List<ProductResource> productResources = new ArrayList<ProductResource>(); 

ressources:

public class Resource implements Serializable { 

@OneToMany(mappedBy="resource", fetch=FetchType.EAGER, cascade=CascadeType.ALL) 
private List<ProductResource> productResources = new ArrayList<ProductResource>(); 

Salutations Marcel

Répondre

0

Il y a en fait 3 solutions:

1) Supprimer les orphelins bef Vous devez supprimer l'objet ProductResource. La raison pour laquelle ProductResource n'a pas été supprimé est qu'il y avait encore des objets dans le système qui les référencent.

2) Supprimez les références dans les orphelins à l'objet ProductResource. C'est pour la même raison que ci-dessus.

3) Définissez les objets Product et Resource comme @PrivateOwned à l'aide des annotations JPA. Cela entraînera la suppression automatique des orphelins s'ils existent. C'est un comportement que vous pouvez ou ne voulez pas faire automatiquement pour vous. Cela peut être dû au fait qu'un objet Product ou Resource n'a pas besoin d'une référence à ProductResource pour exister. Cela dépend de votre conception.

+0

Merci beaucoup pour votre explication détaillée. Au début, JPA semble très facile à utiliser. Le diable est dans les détails. C'est génial que des gens comme vous passent leur temps à aider un novice comme moi. Salutations Marcel –

0

Ce qui suit est la solution:

Classe de produit

@PrivateOwned 
@OneToMany(mappedBy="product", fetch=FetchType.EAGER, cascade=CascadeType.ALL) 
private List<ProductResource> productResources = new ArrayList<ProductResource>(); 

Catégorie de ressources

@PrivateOwned 
@OneToMany(mappedBy="resource", fetch=FetchType.EAGER, cascade=CascadeType.ALL) 
private List<ProductResource> productResources = new ArrayList<ProductResource>(); 

@PrivateOwned est nouveau ...

Marcel

Questions connexes