Таблица ассоциации JPA не удаляется - PullRequest
1 голос
/ 20 марта 2010

У меня проблема с JPA (EclipseLink). Я не могу удалить таблицу связей. Это ситуация:

  • Продукт 1: n для ProductResource
  • Ресурс 1: n для ProductResource

Сначала я устанавливаю атрибуты продукта и ресурса ProductResource. Если я затем пытаюсь удалить объект ProductResource, то ничего не происходит (никакой sql не генерируется - не исключение). Если я закомментирую обе аннотации OneToMany в ProductResource, я могу удалить объект. Я также могу удалить объект, когда атрибуты продукта и ресурса не установлены. Если я закомментирую только аннотацию над атрибутом ресурса, объект ProductResource будет удален после удаления объекта продукта (cascade = CascadeType.ALL). Я надеюсь, что кто-то может дать мне подсказку. Спасибо.

Ресурс продукта:

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;

Продукт:

public class Product implements Serializable {

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

Ресурс:

public class Resource implements Serializable {

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

Привет Марсель

Ответы [ 2 ]

0 голосов
/ 20 марта 2010

На самом деле есть 3 решения:

1) Удалите сирот перед удалением объекта ProductResource. Причина, по которой ProductResource не был удален, заключается в том, что в системе еще остались объекты, ссылающиеся на них.

2) Удалите ссылки в объектах ProductResource в объектах-сиротах. Это по той же причине, что и выше.

3) Установите объекты Product и Resource как @ PrivateOwned , используя аннотации JPA. Это приведет к автоматическому удалению сирот, если они существуют. Это поведение, которое вы можете или не хотите делать автоматически для вас. Причиной этого может быть то, что объект Product или Resource не нуждается в ссылке на ProductResource для существования. Это зависит от вашего дизайна.

0 голосов
/ 20 марта 2010

Следующим было решение:

Класс продукции

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

Класс ресурса

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

@ PrivateOwned новый ...

Marcel

...