我必须创建复杂的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)。
我想知道是否有办法将工作类型映射为键,而不使用“公式”并且不将类型列添加到关系表。
答案 0 :(得分:1)
正如你所说,你的部分问题是你有一个循环引用。这通常不是一个好主意,所以你可能想要一个替代结构。你真的需要循环参考吗?为什么工人需要有工作类型和工作的地图?我可能会将worker和work之间的连接放在另一个类中,所以你不需要循环引用。