0

我的 Hibernate 应用程序中有以下实体:-

Store, Item, Category有以下关系

Store有一对多的关系Item

Category与其他类别有多对多的关系(即父类别有子类别)

Item与具有相同父类别的类别具有多对多关系。

我想要一个商店拥有其商品的顶级类别的列表。

我尝试了这个 HQL 查询,但它只返回一个顶级类别

String queryString = "select c.parentCategory from Category c where :store in elements(c.items)";

List categories = getSession().createQuery(queryString).setEntity("store", store).list();

请帮我解决这个问题。

提前致谢。

4

2 回答 2

0

我以前做过类似的事情,但稍微简化了一点。如果一个类别只能有一个父类别,您可以将其建模为:

@Entity
public class Category

@OneToMany(mappedBy = "parentCategory", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Category> childCategories;

@ManyToOne
@JoinColumn(name = "parentCategoryId", nullable = true)
private Category parent;

查找顶级类别是查找父级为空的类别的简单案例。

sessionFactory.getCurrentSession().createQuery("from Category where parent is NULL")

这符合我的需要,但需要限制类别只能有一个父级。

于 2013-03-17T14:38:55.927 回答
0

您可以在逻辑级别和 ORM 级别实现它,而不仅仅是在 ORM 级别。

首先,添加关系:store与Category是一对多的关系其次,在插入/更新/删除一个Item之前添加一个预处理器,用于在商店级别添加或删除Category。

public void preProcessForItemInserting(Item item){
    Store store = getStoreDao().get( item.getStoreId() );
    Set<Category> storeCategories = store.getCategories();
    Set<Category> itemCategories = item.getCategories();
    storeCategories.addAll( itemCategories );
    getStoreDao().save( store );
}

//it is a little bit more complex than inserting logic
public void preProcessForItemUpdating(Item item){...}

//it is a little bit more complex than inserting logic
public void preProcessForItemDeleting(Item item){...}

总而言之,这是面向数据设计和面向应用设计的经典问题。我们可以根据需求在这两个方面调整我们的应用程序,而不仅仅是数据建模或应用程序优化。

于 2013-03-18T05:26:36.537 回答