与Id(主键)以外的列的一对多关系

时间:2013-11-18 07:16:03

标签: java hibernate nhibernate-mapping

我正在尝试使用hibernate一对多映射来映射两个表。但是,它总是用错误的列映射。请任何人帮我这个。

Level4_Master [level_id (PK/Auto Increament), company_id, level_name, next_level_id, ts]
Level3_Master [level_id (PK/Auto Increament), prv_level_id, level_name, next_level_id, ts]

以上是我用于映射的两个表。在这里,我想要将 Level4_Master 的列 next_level_id 映射到 Level3_Master prv_level_id 列。但是,hibernate始终将列 prv_level_id level4_Master level_id 映射为FK。我的映射文件是:

<hibernate-mapping>
<class name="com.pojo.Level4" table="Level4_Master">
    <id name="levelId" type="java.lang.Integer">
        <column name="level_id" />
        <generator class="increment" />
    </id>
    <property name="companyId" >
        <column name="company_id" length="10" not-null="true" unique="true" />
    </property>
    <property name="levelName">
        <column name="level_name" length="20" not-null="true" unique="true" />
    </property>
    <property name="nextLevelId" type="java.lang.Integer">
        <column name="next_level_id" />
    </property>
    <set name="levelList" table="Level3_Master" inverse="true" lazy="true" fetch="select">
        <key>
            <column name="prv_level_id" not-null="true" />
        </key>
        <one-to-many class="com.pojo.Level3" />
    </set>
</class>
</hibernate-mapping>

<hibernate-mapping>
<class name="com.pojo.Level3" table="Level3_Master">
<id name="levelId" type="java.lang.Integer">
    <column name="level_id" />
    <generator class="increment" />
</id>
<property name="prvLevelId" >
    <column name="prv_level_id" length="10" not-null="true" unique="true" />
</property>
<property name="levelName">
    <column name="level_name" length="20" not-null="true" unique="true" />
</property>
<property name="nextLevelId" type="java.lang.Integer">
    <column name="next_level_id" />
</property>
<set name="levelList" table="Level2_Master" inverse="true" lazy="true" fetch="select">
    <key>
        <column name="prv_level_id" not-null="true" />
    </key>
    <one-to-many class="com.pojo.Level2" />
</set>
</class>
</hibernate-mapping>

我的pojo类就像

class Level4{
  private int levelId;
  private int companyId;
  private String levelName;
  private int nextLevelId;
  private Set<Level3> levelList = new HashSet<Level3>(0); 
  private Timestamp ts;
  //getter n setter
}

class Level3{
  private int levelId;
  private int prvLevelId;
  private String levelName;
  private int nextLevelId;
  private Set<Level2> levelList = new HashSet<Level2>(0); 
  private Timestamp ts;
  //getter n setter
}

1 个答案:

答案 0 :(得分:1)

您需要将property-ref属性与属性名称一起使用。该属性必须在属性映射中添加unique="true"

示例 -

<hibernate-mapping><class name="com.pojo.Level4" table="Level4_Master">
<id name="levelId" type="java.lang.Integer">
    <column name="level_id" />
    <generator class="increment" />
</id>
<property name="companyId" >
    <column name="company_id" length="10" not-null="true" unique="true" />
</property>
<property name="levelName">
    <column name="level_name" length="20" not-null="true" unique="true" />
</property>
<property name="nextLevelId" type="java.lang.Integer" unique="true">
    <column name="next_level_id" />
</property>
<set name="levelList" table="Level3_Master" inverse="true" lazy="true" fetch="select">
    <key>
        <column name="prv_level_id" not-null="true" property-ref="nextLevelId"/>
    </key>
    <one-to-many class="com.pojo.Level3" />
</set>