我正在尝试使用(旧版)数据库表映射以下实体,并且无法映射地图:
public class Configuration {
private Long configurationId;
private String code;
private Long index;
private Map<String, ConfigurationParam> configurationParams;
...
}
和
public class ConfigurationParam {
private Long configurationId; // foreign key
private String code;
private String value;
...
}
如您所见,配置对象包含 configurationParam 对象的映射。地图的关键是 ConfigurationParam 的代码属性。请注意,每个实体的属性代码彼此无关(传统架构:()
hibernate映射如下所示:
<class name="Configuration" table="CONFIGURATION" dynamic-update="true">
<id name="configurationId" column="CONFIGURATIONID">
<generator class="assigned" />
</id>
<property name="configurationSetId" column="CONFIGURATIONSETID" />
<property name="code" column="CODE" />
<property name="index" column="INDX" />
<map name="configurationParams" lazy="true" table="CONFIGURATIONPARAM" fetch="select"
batch-sie="10">
<key column="CONFIGURATIONID" />
<map-key type="string" column="CODE"/>
<element type="ConfigurationParam"></element>
</map>
</class>
和
<class name="ConfigurationParam" table="CONFIGURATIONPARAM" dynamic-update="true">
<composite-id class="ConfigurationParamId" mapped="true">
<key-property name="configurationId"/>
<key-property name="code"/>
</composite-id>
<property name="configurationId" column="CONFIGURATIONID" />
<property name="code" column="CODE" />
<property name="value" column="VALUE" />
</class>
但是,params没有按照所需的方式加载,如果我打开eager抓取也没有加载,如果我尝试使用命名查询获取配置并且 join fetch configurationParams ,则不会加载。
为什么会这样?以及如何正确映射关联?
我已经有了一些想法可能会出现问题这似乎不是问题(至少是单独的):
两个实体都有一个名为 code 的属性,Hibernate可能使用了错误的 map-key ? (它当然应该使用ConfigurationParam实体的代码属性。)
ConfigurationParam.code不是唯一的。如您所见,ConfigurationParam的主键是复合。 但是,由于它是由Configuration维护的映射,其主键是此组合的第二部分,我认为这应该没问题。无论如何,Hibernate都没有抱怨。
ConfigurationParam.code已经映射为实体本身的属性。可能那么你不能再用它作为地图键吗?但是,我猜这个Hibernate会告诉我吗?
我试图在Hibernate文档中找到答案(你知道猫等等)并在这里阅读了很多其他问题,但没有找到这个特定问题的答案
答案 0 :(得分:1)
好的,毕竟让它上班了。地图拥有实体的映射必须如下:
<map name="configurationParams">
<key column="CONFIGURATIONID" />
<map-key type="string" column="CODE"/>
<one-to-many class="ConfigurationParam" />
</map>
似乎元素标记用于基本类型映射(例如,用于Map)。如果要将映射实体作为映射值,则需要一对多标记。
hibernate文档声明:“对于基本或可嵌入类型的集合,使用@ElementCollection ”(http://docs.jboss.org/hibernate/core/3.6/reference/en-US /html/collections.html)。
虽然没有详细解释,也没有针对xml映射进行解释,但在解决了我的问题之后,我就这样读了。