Java 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

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

我有两个实体:

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>