【发布时间】:2016-03-28 01:04:42
【问题描述】:
假设,我有一个实体 Country extends Entity。每个实体都应该有某种元数据(翻译、描述、创建日期等...)。
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>
所以,我需要的是:我想要一个包含所有元数据的国家/地区列表。我使用以下 HQL:
List<Country> countryList = (List<Country>)databaseUtilities.getSession()
.createQuery("FROM Country c JOIN FETCH c.metaData m")
.list();
Hibernate 也选择了所有内容(我什至看到所有集合都在调试中初始化),但 Country.metaData 仍然是 PersistentMap(而不是我想要的 HashMap),当我尝试时收到 null:
EntityMetaData entityMetaData = metaData.get(locale.getDisplayName());
^^^^^^^^^^^^
如何解决这个问题?
谢谢。
附:休眠 5.0.3.Final
【问题讨论】:
标签: hibernate join hql hibernate-mapping