我必须创建复杂的休眠映射。以下简化示例解释了我的问题。
我有两个实体:
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)是映射值(Work)的一部分。
我的休眠 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
属性)。我想知道是否有办法将工作类型映射为键,而不使用“公式”并且不将类型列添加到关系表中。