Hibernate建模问题

时间:2011-02-11 13:15:48

标签: hibernate

我无法在Hibernate中以我想要的方式解决这个问题。这是:我有一个产品,每个产品都有自己的领域等等。每个产品可以是TopLevelProduct或SecondaryProduct。辅助产品将链接到顶级产品,顶级产品将无关联。当我从数据库查询产品时,我想知道它是否是TopLevel。链接的辅助产品列表可以在以后(甚至之前,但不是必需的)检索。

我想过使用这个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产品的顶级产品。

想法?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

除了Marko的回答,如果你决定在删除顶级产品时应用级联删除,你有两个选择:

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

  • 否则,您可以通过在Product之间创建双向关系来解决您的问题,如下所示:

    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;
    
        ...
    }