映射的Hibernate映射,其中key是复杂值的一部分

时间:2012-09-06 08:52:17

标签: java hibernate

我必须创建复杂的hibernate映射。以下简化示例解释了我的问题。

我有两个实体:

public class Work {

  private WorkType type;
  private Set<Workers>;
  ...
}

public class Worker {

  private Map<WorkType,Work>;
  ...
}

我有3张桌子:

t_works columns: id, type,...
t_workers columns: id,...
t_work_worker columns: worker_id, work_id.

我想用hibernate映射地图,而不是将类型值复制到t_work_worker。 这里的问题是地图键(WorkType)是地图值(工作)的一部分。

我的hibernate hbm:

<typedef class="org.hibernate.type.EnumType" name="workType">
   <param name="enumClass">myPackage.WorkType</param> 
   <param name="type">12</param> 
</typedef>

<class name="work" table="T_WORKS">
    <property name="type" type="workType" column="type"/>
    <set name="workers" table="T_WORK_WORKER" inverse="true" lazy="false" cascade="none">
        <key column="WORK_ID" />
        <many-to-many column="WORKER_ID"class="myPackage.Worker"/>
    </set>
</class>

<class name="Worker" table="T_WORKERS">
    <map name="channels" table="T_WORK_WORKER" lazy="false" cascade="all">
       <key column="WORKER_ID" />                        
       <map-key formula="(select w.TYPE from t_works w where w.ID=WORK_ID)"type="workType"/>
       <many-to-many column="WORK_ID" class="myPackage.Work"/>
    </map>
</class>

此映射有效但需要额外的select语句(请参阅formula atribute)。 我想知道是否有办法将工作类型映射为键,而不使用“公式”并且不将类型列添加到关系表。

1 个答案:

答案 0 :(得分:1)

正如你所说,你的部分问题是你有一个循环引用。这通常不是一个好主意,所以你可能想要一个替代结构。你真的需要循环参考吗?为什么工人需要有工作类型和工作的地图?我可能会将worker和work之间的连接放在另一个类中,所以你不需要循环引用。