2010-03-19 50 views
1

我有JPA(EclipseLink)的问题。 我无法删除关联表。情况是这样的:JPA关联表不可删除

  • 产品1:N至ProductResource
  • 资源1​​:N至ProductResource

我第一次ProductResource的产品和资源属性。如果我然后尝试删除ProductResource对象,则不会发生任何事情(不会生成sql - 没有例外)。如果我在ProductResource中注释掉这两个OneToMany注释,我可以删除该对象。当产品和资源属性未设置时,我也可以删除该对象。如果我只注释了资源上方的注释,则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对象。产品资源未被删除的原因是因为系统中仍存在引用它们的对象。

2)删除孤儿中对ProductResource对象的引用。这是出于与上述相同的原因。

3)使用JPA批注将产品和资源对象设置为@PrivateOwned。这将导致孤儿自动被删除,如果它们存在。这是您可能会或可能不想为您自动完成的行为。造成这种情况的原因可能是因为产品或资源对象不需要对ProductResource存在的引用。这取决于你的设计。

+0

非常感谢您的详细解释。起初JPA看起来很容易使用。魔鬼在细节中。非常感谢像你这样的人花时间帮助像我这样的新手。 问候马塞尔 – 2010-03-21 12:45:20

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是新...

马塞尔