2012-09-06 1 views
2

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.

Répondre

1

Comme vous l'avez dit, une partie de votre problème est que vous avez une référence circulaire. Ce n'est généralement pas une très bonne idée, donc vous pourriez vouloir penser à une structure alternative. Avez-vous vraiment besoin de la référence circulaire? Pourquoi le travailleur a-t-il besoin d'une carte de type de travail et de travail? Je ferais probablement la connexion entre le travailleur et le travail dans une autre classe, donc vous n'aurez pas besoin de la référence circulaire.

Questions connexes