2010-03-19 5 views
1

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

  • Продукт 1: п в ProductResource
  • Ресурс 1: п в ProductResource

Я первый набор продукта и ресурса атрибуты ProductResource. Если я попытаюсь удалить объект ProductResource, ничего не происходит (никакой sql не генерируется - исключение). Если я прокомментирую аннотации OneToMany в ProductResource, я могу удалить объект. Я также могу удалить объект, если атрибуты продукта и ресурса не установлены. Если я комментирую только аннотацию выше ressource, атрибут объекта 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>(); 

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

ответ

0

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

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

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

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

+0

Большое спасибо за подробное объяснение. Сначала JPA выглядит очень прост в использовании. Дьявол в деталях. Отлично, что такие люди, как вы, тратите свое время, помогая новичкам, как я. Поздравления Марсель –

0

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

Класс продукта

@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 новый ...

Марсель

Смежные вопросы