0

Hibernate アプリケーションに次のエンティティがあります。

Store, Item, Category次の関係で

Storeと 1 対多の関係がありますItem

Category他のカテゴリと多対多の関係がある (つまり、親カテゴリに子カテゴリがある)

Item同じ親カテゴリを持つカテゴリと多対多の関係があります。

ストアのアイテムが含まれる最上位のカテゴリのリストが必要です。

この HQL クエリを試しましたが、最上位のカテゴリが 1 つしか返されません

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

私は以前に似たようなことをしましたが、少し単純化しました。カテゴリが 1 つの親しか持つことができない場合、次のようにモデル化できます。

@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;

トップ レベルのカテゴリを見つけることは、親が null であるカテゴリを見つける単純なケースです。

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

これは私のニーズには合っていましたが、カテゴリが 1 つの親しか持てないという制限が必要でした。

于 2013-03-17T14:38:55.927 に答える
0

ORM レベルだけでなく、ロジック レベルと ORM レベルの両方で実装できます。

まず、関係を追加します。ストアはカテゴリと 1 対多の関係を持ちます。次に、アイテムを挿入/更新/削除する前にプリプロセッサを追加して、ストア レベルでカテゴリを追加または削除します。

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 に答える