2015-12-21 22 views
0

想,我有一個實體,延伸全國的實體。每個實體都應該有某種元數據(翻譯,描述,創建等)。休眠5:如何加入的HQL一個HashMap?

public abstract class Entity<T> implements Serializable { 
    protected Map<Language,EntityMetaData> metaData; 
    // constructors, setters, getters etc. 
} 

public class Country extends Entity<Long> implements Serializable { 
    // some fields 
    // constructors, setters, getters etc. 
} 

public class EntityMetaData extends Entity<Long> implements Serializable { 
    private String name; 
    private String description; 
    private Language language; 
    // constructors, setters, getters etc. 
} 

這裏是我的國家測繪:

<class name="Country" table="COUNTRIES" schema="EDRIVE" dynamic-update="false" dynamic-insert="true" batch-size="30"> 
    <meta attribute="class-description"> 
     This class contains countries 
    </meta> 
    <id name="id" type="long" column="id"> 
     <generator class="identity" /> 
    </id> 
    <property name="isoCode2" column="isocode2" type="string" length="2"/> 
    <property name="isoCode3" column="isocode3" type="string" length="3"/> 
    <property name="telephoneCode" column="telephonecode" type="int"/> 
    <property name="timezone" column="timezone" type="boolean"/> 
    <!--+ 
     | CountriesMetaData 
     +--> 
    <map name="metaData" fetch="join" cascade="all" batch-size="10" table="CountriesMetaData"> 
     <key column="entityId"/> 
     <map-key-many-to-many column="languageId" class="Language"/> 
     <one-to-many entity-name="countriesMetaData"/> 
    </map> 
</class> 

和EntityMetaData:

<class name="EntityMetaData" entity-name="countriesMetaData" table="COUNTRIESMETADATA" lazy="false"> 
    <id name="id" type="long" column="id" access="field"> 
     <generator class="identity" /> 
    </id> 
    <property name="name" column="name" type="string" length="256" /> 
    <property name="description" column="description" type="string" length="512"/> 
    <many-to-one name="language" class="Language" column="languageid" not-null="true"/> 
</class> 

所以,我需要什麼:我想與所有他們metadatas一個國家名單。我用下面的HQL:

List<Country> countryList = (List<Country>)databaseUtilities.getSession() 
      .createQuery("FROM Country c JOIN FETCH c.metaData m") 
      .list(); 

Hibernate的一切選擇,以及(我甚至看到在調試初始化所有集合),但仍Country.metaData PersistentMap(而不是HashMap中我想要的),我收到空當我嘗試到:

EntityMetaData entityMetaData = metaData.get(locale.getDisplayName()); 
           ^^^^^^^^^^^^ 

如何解決此問題?

謝謝。

P.S.休眠5.0.3.Final

回答

0

PersistentMap是Map的包裝,你可以很容易地檢索它。你試過這個嗎?

Map metaData = country.getMetaData();

+0

是的,我做了。它返回PersistentMap。 – maksim2020

+0

在事務內部,執行查詢之後? PersistentMap將會話和地圖包裝在一起。您需要會話對象從包裝中提取地圖。 – Felix

+0

我明白你的意思。我正在重寫我的DAOImpl類以便在一個事務中執行轉換。有關詳細信息,請參閱http://stackoverflow.com/questions/21703851/how-to-fetch-a-map-in-hibernate。 – maksim2020