2010-09-24 10 views
1

J'ai un modèle de domaine qui ressemble à ceci:Modification de la discriminent colonne dans une seule table sous classe avec l'héritage JPA

 Instruction 
     |  \ 
    Money Other 
    / \ 
    Unit Cash 

et je veux la carte ce modèle à mon DB en utilisant JPA.

Toutes les classes sont mappées à la même table dans le DB (T_INSTRUCTION). J'ai donc commencé avec la stratégie d'héritage SINGLE_TABLE de jpa. Séparer les classes Money et Other en utilisant le fichier orm xml discriminate-column="MONEY_TYPE_ID".

Mon problème est que je veux aussi SPERATE sous les classes Cash et Unit mais ils pratiquent la discrimination une autre colonne « CASH_TYPE_ID ».

En scannant les documents, cela ne me semble pas possible, mais je me demandais si quelqu'un avait des astuces ou des solutions pour le faire?

Vive

+0

Alors, quel est le résultat attendu à la fin? 2 colonnes discriminantes? –

+0

Ouais, je veux essentiellement utiliser 2 colonnes discriminantes différentes dans la hiérarchie des objets. – alanl

+1

Qui a besoin de CASH_TYPE_ID exactement? Que devrait contenir le MONEY_TYPE_ID dans ce cas? Pourriez-vous montrer quelques exemples d'enregistrements pour illustrer les contraintes (pour les autres applications), cela pourrait aider à trouver une solution de travail acceptable. –

Répondre

1

Après avoir examiné cela un peu plus loin, il n'y a pas de solution à ce problème dans la spécification JSR actuelle.

Alors, que j'ai décidé de le faire à la fin, était d'utiliser l'héritage de table unique JPA pour le « Instruction » « Money » et « Other » types et pour permettre « Cash » et 'Unit' sous types de inhert simples de ces . (c'est-à-dire) 'discriminate-column="MONEY_TYPE_ID"'

Ensuite, utilisez le constructeur dans les champs 'cash' et 'unit' pour définir le mappage à CASH_TYPE_ID. PS: Je posterai le code plus tard

1

Une solution peut consister à avoir des valeurs différentes de discriminateurs pour chaque sous-classe, et une seule colonne discriminante. c'est-à-dire argent = 1, autre = 2, unité = 3, argent = 4

+0

Ouais cela fonctionnerait, mais malheureusement la table est partagée avec d'autres applications, donc je ne peux pas changer sa structure. à votre santé – alanl