Hibernate集合映射:实体1中的map <string,entity2 =“”>属性</string,>

时间:2011-11-08 17:33:32

标签: hibernate hibernate-mapping many-to-one

我正在尝试使用(旧版)数据库表映射以下实体,并且无法映射地图:

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 ,则不会加载。

为什么会这样?以及如何正确映射关联?

我已经有了一些想法可能会出现问题这似乎不是问题(至少是单独的):

  1. 两个实体都有一个名为 code 的属性,Hibernate可能使用了错误的 map-key ? (它当然应该使用ConfigurationParam实体的代码属性。)

  2. ConfigurationParam.code不是唯一的。如您所见,ConfigurationParam的主键是复合。 但是,由于它是由Configuration维护的映射,其主键是此组合的第二部分,我认为这应该没问题。无论如何,Hibernate都没有抱怨。

  3. ConfigurationParam.code已经映射为实体本身的属性。可能那么你不能再用它作为地图键吗?但是,我猜这个Hibernate会告诉我吗?

  4. 我试图在Hibernate文档中找到答案(你知道猫等等)并在这里阅读了很多其他问题,但没有找到这个特定问题的答案

1 个答案:

答案 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映射进行解释,但在解决了我的问题之后,我就这样读了。