Java Hibernate映射,其中键是复杂值的一部分
我必须创建复杂的hibernate映射。下面的简化示例解释了我的问题 我有两个实体:Java Hibernate映射,其中键是复杂值的一部分,java,hibernate,Java,Hibernate,我必须创建复杂的hibernate映射。下面的简化示例解释了我的问题 我有两个实体: public class Work { private WorkType type; private Set<Workers>; ... } public class Worker { private Map<WorkType,Work>; ... } 我希望使用hibernate映射映射,而不将类型值复制到t_work_worker。 这里的问题是映射键(W
public class Work {
private WorkType type;
private Set<Workers>;
...
}
public class Worker {
private Map<WorkType,Work>;
...
}
我希望使用hibernate映射映射,而不将类型值复制到t_work_worker。
这里的问题是映射键(WorkType)是映射值(Work)的一部分
我的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>
myPackage.WorkType
12
此映射可以工作,但需要额外的select语句(请参见formula
atribute)。
我想知道是否有办法将工作类型映射为键,而不使用“公式”,也不向关系表添加类型列 正如你所说,你的部分问题在于你有一个循环引用。这通常不是一个很好的主意,因此您可能需要考虑另一种结构。你真的需要循环引用吗?为什么员工需要工作类型和工作的地图?我可能会在另一个类中建立worker和work之间的连接,因此您不需要循环引用
<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>