2011-02-11 53 views
0

我无法在Hibernate中解决这个问题。这里是:我有一个产品,每个产品都有自己的领域等等。每个产品都可以是TopLevelProduct或SecondaryProduct。次级产品将与顶级产品相关联,顶级产品将与任何东西相关联。当我从数据库查询产品时,我想知道它是否是TopLevel。链接的次级产品清单可以稍后检索(甚至可以在之前检索,但并非如此)。Hibernate建模问题

我想用这个bean的:

public class Product{ 

...properties.. 

Product topLevelProduct; 

...getters and setters... 

} 

的问题是,如果我映射topLevelProduct财产多到一,我已经删除顶级产品的问题。事实上,如果他们有一个链接到二次产品,我得到:

java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`jacciseweb`.`prodotti`, CONSTRAINT `FKC803BB11ACD3B812` FOREIGN KEY (`prodottoDiRiferimento_ID`) REFERENCES `prodotti` (`ID`)) 

我希望,如果我删除TopLevelProduct,该secondLevelProducts也将被删除。我应该使用不同的结构吗?也许使用来自同一个bean的两个bean?或逆转这样的关系:

public class Product{ 

...properties.. 

List<Product> secondLevelProducts = new ArrayList<Product>(); 

...getters and setters... 

} 

这无论如何给了我一个问题:我要使用另一个查询知道,如果该产品是次要的或不是,因为只知道它没有任何辅助产品,没有按”这意味着它是次要的,它甚至可能是没有secondLevel产品的顶级产品。

想法?

回答

1

我不太了解hibernate,但这里的问题在我看来很简单。当第二级产品引用它们时,您不能删除顶级产品。

解决方案是定义如果删除最高级别,应该对二级产品发生什么情况。您可以级联操作(所有二级产品都将被删除)。或者二级产品成为顶级产品。在关联中定义所需的行为必须有一种方法在休眠中。在文档中搜索类似“级联删除”的内容。

1

除了马尔科的答案,如果你决定申请当顶级产品被删除级联删除,你有两个选择:

  • 如果顶级的产品和辅助产品之间的区别是稳定的,即顶级产品永远不会变成二级产品,反之亦然,您可以将其建模为具有TopLevelProductSecondaryProduct之间的一对多关系的继承层次结构(此关系可以是单向或双向的,如果您需要访问父母产品)。

  • 否则,您可以通过创建Product S之间这样的双向关系,解决你的问题:

    public class Product { 
        @ManyToOne 
        private Product topLevelProduct; // Is null for top level products 
    
        // Applies cascading 
        @OneToMany(mappedBy = "topLevelProduct", cascade = CascadeType.REMOVE) 
        private List<Product> secondaryProducts; 
    
        ... 
    } 
    
+0

我现在想这个权利。问题是我必须每次在辅助bean中设置一个topLevelProduct时手动更新secondaryProducts。有没有办法做到这一点automagically? – gotch4 2011-02-11 13:59:00