0

次の2つのエンティティがあります

@Entity
public class Manufacturer {

    private int manufacturerId;
    private Category category;
    private Set<Products> productList;



    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinTable(name="manufacturer_products", joinColumns={@JoinColumn(name="manufacturerId")}, 
    inverseJoinColumns={@JoinColumn(name="productId")})
    public Set<Product> getProductList() {
        return productList;
    }
    public void setProductList(Set<Product> productList) {
        this.productList = productList;
    }
        @ManyToOne
    @JoinColumn(name="categoryId")
    public Category getCategory() {
        return category;
    public void setCategory(Category category) {
        this.category = category;
    }
}


@Entity
public class Product {

    private int productId;
    private String modelNumber;
    private String name;
    private String description;
    private Category category;
    }

カテゴリーに関連するメーカーを調べたい。製品とメーカーの間の関係は積極的に初期化されるため、manufacturer_product テーブル内にマップされたすべてのメーカー インスタンスを取得します。また、出力リストには同じメーカーの複数のインスタンスが含まれていることに注意してください。遅延初期化しようとすると、LazyInitialization Exception が発生するか、製品リストをループしてデータを手動でフェッチする必要があります。私は後者のアプローチを避けようとしています。それはパフォーマンスに大きな影響を与えるからです。休止状態のドキュメントを調べましたが、問題の解決策が見つかりませんでした。何か不足している場合、または他に必要な場合はお知らせください。どんな助けでも大歓迎です。

これは、Category が設定された Manufacturer インスタンスを渡す DAO クラス メソッドです。それに基づいてルックアップを行います。

public List<Manufacturer> findByCategory(Category instance){
    log.debug("Get Manufacturer by Category");
    try {
        List<Manufacturer> results = (List<Manufacturer>) sessionFactory
                .getCurrentSession()
                .createCriteria("com.me.ham.core.model.Manufacturer")
                .add(Restrictions.eq("category", instance))
                .list();
        log.debug("findByCategory successful, result size: "
                + results.size());
        return results;
    } catch (RuntimeException re) {
        log.error("findByCategory failed", re);
        throw re;
    }
}
4

1 に答える 1

1

私が正しく理解していれば、HQLではソウルションは次のようなものです:

 select m 
 from Manufacturer m 
    left join fetch m.category cat
    left join fetch m.productList productList
 where cat = :categoryParam

私は基準を書く専門家ではありませんが、使用できますsetFetchMode。ここにいくつかの情報があります: Hibernate performance: 19.1.2

于 2012-09-30T08:45:12.240 に答える