次の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;
}
}