2010-02-15 7 views
3

J'utilise un schéma de base de données hérité avec des clés composites. J'ai une entité avec deux relations et une des colonnes de jointure est partagée. Par exemple, Disons que j'ai une entité Étudiant avec deux relations Département et Cours. Le département utilise la colonne dept_code tandis que Course utilise dept_code et code_code colum. Le modèle de domaine est tel qu'un étudiant peut appartenir à un département et n'a pas encore opté pour un cours ou l'étudiant peut avoir choisi à la fois le département et le cours. Voici comment la cartographie mise en veille prolongée ressemble:Hibernate: Plus d'une relation utilisant la même colonne de jointure

<many-to-one class="Department" name="department"> 
    <column name="dept_code"/> 
</many-to-one> 

<many-to-one class="Course" name="course> 
    <column name="dept_code"/> 
    <column name="course_code"/> 
</many-to-one> 

Le problème est Hibernate ne permet pas cette application à moins que l'une des relations est marqué en lecture seule utilise insert = false et update = false.

Existe-t-il un moyen de rendre les deux relations accessibles en écriture?

Répondre

1

Pourriez-vous tenter par la suite

1) Définissez la propriété non nulle sur la dept_code et de voir ce qui se passe (est-ce acceptable?)

2) Définissez le service à lecture seule et cours écrire et dans le setDepartment créer un objet de cours avec code_courant null du code de cours existant et utiliser réellement le setCourse et voir si les mises à jour vont bien?

1

Je comprends que vous avez une base de données héritée et ne peut donc probablement pas modifier les tables? Mais si possible, j'insérerais une clé de substitution ou une nouvelle table de jointure.

Si vous ne disposez pas de cette option, vous pouvez toujours écrire votre propre chargement et conserver le SQL. Jetez un oeil à la < loader>, < sql-insert>, < sql-delete> et < sq-update> éléments de mappage. Voir le https://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html/querysql.html chapitre 13.3. et suivant. Comme troisième option, vous pouvez simplement mapper vos entités sans cette connexion et effectuer les méthodes CRUD vous-même: écrivez vous-même les méthodes load, save, update et persist et gérez les connexions entre les entités manuellement. Cela pourrait être fait transaprent à votre code client. L'appelant utiliserait simplement les méthodes setDepartment et getDepartment et votre DAO (ou tout autre concept que vous utilisez) s'occuperait du reste. Btw: Il existe un chapitre utile dans le JPA/Hibernate Book de Manning pour ce genre de problèmes ("Java Persistence with Hibernate" Chapitre 8 - Les bases de données héritées et SQL personnalisé).

Questions connexes