Hibernate Eager初始化获取父对象的多个实例

时间:2012-09-30 07:54:00

标签: hibernate hibernate-mapping

我有两个实体

@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,或者我需要循环遍历产品列表并手动获取数据。我试图避免后来的方法,因为这将是一个伟大的性能打击。我已经浏览了hibernate文档,但我找不到任何解决方案。如果我遗漏任何东西或者您还需要其他任何东西,请告诉我。任何帮助都将受到高度赞赏。

这是我的DAO类方法,我将其中的Category设置传递给Manufacturer实例。它基于此进行查找。

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

1 个答案:

答案 0 :(得分: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