Je dois créer un mappage d'hibernation complexe. L'exemple simplifié suivant explique mon problème.Mise en correspondance Hibernate de la carte où la clé fait partie de la valeur complexe
J'ai deux entités:
public class Work {
private WorkType type;
private Set<Workers>;
...
}
public class Worker {
private Map<WorkType,Work>;
...
}
J'ai 3 tables:
t_works columns: id, type,...
t_workers columns: id,...
t_work_worker columns: worker_id, work_id.
Je veux carte la carte avec mise en veille prolongée, sans copier les valeurs de type à t_work_worker. Le problème ici est que la clé de la carte (WorkType) fait partie de la valeur de la carte (Work).
Mon veille prolongée 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>
Cela fonctionne, mais la cartographie nécessite instruction select supplémentaire (voir formula
atribute). Je me demande s'il existe un moyen de mapper le type de travail en tant que clé, sans utiliser "formula" et sans ajouter la colonne type à la table des relations.