2012-04-03 122 views
2

這裏是我的問題:休眠加入時間太長工作

我有這個類有幾個@oneToMany收藏

public class ActivePropertyList implements Serializable 
{ 

@OneToMany 
@JoinTable(name = "PropertyAttributeLink", 
joinColumns = 
@JoinColumn(name = "EANHotelID"), 
inverseJoinColumns = 
@JoinColumn(name = "AttributeID", referencedColumnName="AttributeID")) 
private Collection<AttributeList> attributeList; 

@OneToMany(fetch= FetchType.LAZY) 
@JoinColumn(name="EANHotelID") 
private Collection<Hotelimageslist> hotelimageslist; 

@OneToMany(fetch= FetchType.LAZY) 
@JoinColumn(name="EANHotelID") 

private Collection<Roomtypelist> roomtypelist; 
//Getters & Setters ... 

當我從XHTML訪問該對象時間過長,產生正如我使用<ui:repeat value=#{controller.ActivePropertyList.attributeList}> ...

PropertyAttributeLink有超過5MIL行和圖像有超過4MIL行,但是當我使用簡單的SQL查詢innerJoin我不會超過幾個小時生成吃了清單。

我試過在AttributeList上使用HQL查詢使用namedQuery,但由於AttributeList沒有引用ActivePropertyList,因爲它是單向的,所以它會拋出錯誤。

有沒有辦法創建HQL NamedQuery來訪問每個列表一次,並將其存儲在控制器中?

public List<AttributeList> getAttributeListByHotelID(int hotelID){ 
    Query q = session().createQuery("from AttributeList AL inner join PropertyAttributeLink PA where PA.hotelID=:hotelID"); 
    return q.list(); 
} 

,但這種方法並不爲HQL工作需要的AttributeList瞭解PropertyAttributeLink

回答

0

指向聯接只是做供那裏的條件和其他的東西,你應該使用atributtes FETCH使關係渴望和擁有它inmediatly,避免懶散iniciators,像

from AttributeList AL inner join FETCH PropertyAttributeLink PA where PA.hotelID=:hotelID 

正如你看到的ISN」我很希望能幫到你,你可以像往常一樣在文檔中獲得更多信息HQL - Associations and joins