2010-12-16 82 views
0

我正在使用Hibernate。我的數據庫是如下休眠查詢問題

一類具有許多屬性

類類 包含

private Set <Attribute> AllAttributes= new HashSet <Attribute>(); 

類屬性

如何取回所有類別及其屬性在一起,因爲我想'從類別'但它不起作用

類別映射文件:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated Dec 16, 2010 8:37:02 AM by Hibernate Tools 3.4.0.Beta1 --> 
<hibernate-mapping> 
    <class name="com.BiddingSystem.Models.Category" table="CATEGORY"> 
     <id name="CategoryId" type="long"> 
      <column name="CATEGORYID" /> 
      <generator class="native" /> 
     </id> 
     <property name="CategoryName" type="java.lang.String"> 
      <column name="CATEGORYNAME" /> 
     </property> 

     <many-to-one name="ParentCategory" class="com.BiddingSystem.Models.Category"> 
      <column name="PARENT_CATEGORY_ID" /> 
     </many-to-one> 

     <set name="SubCategory" lazy="false" cascade="all-delete-orphan" inverse="true"> 
      <key> 
       <column name="PARENT_CATEGORY_ID" /> 
      </key> 
      <one-to-many class="com.BiddingSystem.Models.Category" /> 
     </set> 

     <set name="AllAttributes" table="ATTRIBUTE" inverse="false" lazy="true" cascade="all"> 
      <key> 
       <column name="CATEGORYID" /> 
      </key> 
      <one-to-many class="com.BiddingSystem.Models.Attribute" /> 
     </set> 

    </class> 
</hibernate-mapping> 

屬性映射文件:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated Dec 16, 2010 5:25:09 AM by Hibernate Tools 3.4.0.Beta1 --> 
<hibernate-mapping> 
    <class name="com.BiddingSystem.Models.Attribute" table="ATTRIBUTE"> 
     <id name="AttributeId" type="long"> 
      <column name="ATTRIBUTEID" /> 
      <generator class="native" /> 
     </id> 
     <property name="AttributeName" type="java.lang.String"> 
      <column name="ATTRIBUTENAME" /> 
     </property> 
     <set name="Options" table="ATTRIBUTEOPTION" inverse="false" cascade="all"> 
      <key> 
       <column name="ATTRIBUTEID" /> 
      </key> 
      <one-to-many class="com.BiddingSystem.Models.AttributeOption" /> 
     </set> 
    </class> 
</hibernate-mapping> 
+1

定義「不工作」?什麼是您的映射文件/您的映射註釋? – meriton 2010-12-16 20:25:48

回答

2

您已映射伴隨lazy="true"。這告訴休眠,默認情況下,只有在實際訪問數據庫時才應該從數據庫加載類別的屬性,而不是在加載類別時指示hibernate加載屬性的lazy="false"。但是,映射文件中的指令會影響所有查詢。

如果你希望它只是一個特定的查詢,請 http://docs.jboss.org/hibernate/core/3.5/reference/en/html/queryhql.html#queryhql-joins

A「取」加入允許協會或值的 藏品是 與父母一起初始化使用 對象單選。這是 在 集合的情況下特別有用。它有效地覆蓋 的外連接和延遲聲明 的關聯映射文件 和集合。有關更多 信息,請參見第20.1節, 「獲取策略」。

from Cat as cat 
    inner join fetch cat.mate 
    left join fetch cat.kittens 

甲取加入通常並不需要 分配一個別名,因爲 相關聯的對象不應where子句(或任何其它 子句)中使用 。關聯對象 也不直接返回 查詢結果。相反,它們可能是通過父對象訪問的 。你可能需要一個別名 唯一原因是 如果你是遞歸連接抓取一個 進一步收集:

from Cat as cat 
    inner join fetch cat.mate 
    left join fetch cat.kittens child 
    left join fetch child.kittens 

fetch構造不能 查詢中使用使用iterator()(雖然 滾動(所謂的)能使用)。取應符合setMaxResults()或 setFirstResult()共用一起使用 ,因爲這些操作 是基於其 通常包含渴望 收集抓取重複的結果行,因此,行數 是不是你所期望的。 Fetch也不應該與條件即興一起使用 。它是 可能創建一個笛卡爾產品 通過聯接提取查詢中的多個 集合,因此請注意 這種情況。加入獲取多個 收藏角色可以產生 收藏夾映射的意外結果, 因此,在此情況下,當 制定查詢時,建議用戶自行決定。 最後,請注意,完整連接抓取和 右側連接抓取都沒有意義。