2012-09-06 163 views
2

我必须创建复杂的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. 

我想与休眠的地图,而不复制类型值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属性附加伤害)。 我想知道是否有办法将工作类型映射为关键字,而不使用“公式”,也没有向关系表中添加类型列。

回答

1

正如你所说,你的部分问题是你有一个循环引用。这通常不是一个好主意,所以你可能想要考虑一个替代结构。你真的需要循环引用吗?为什么工作人员需要有工作类型和工作地图?我可能会让工作人员和另一个班级的工作联系起来,所以你不需要循环引用。