2009-11-04 4 views
0

Je me suis cogné avec un problème très particulier. En utilisant OpenJPA (KODO 4.1), existe-t-il un moyen d'utiliser plus d'une colonne en tant que colonne discriminante?colonnes discriminantes multiples pour les sous-classes persistantes

Mon problème est que j'ai une structure de table (que j'ai une capacité limitée à modifier bien sûr) semblable à ceci:

Table VEHICLE  EXPENSIVE_CAR CHEAP_CAR  EXPENSIVE_BOAT CHEAP_BOAT 
--------------------------------------------------------------------------------- 
     HORSE_POWER LUXURY_ACC  CLASIFICATION SIZE    SIZE 
     MEDIUM  EXTRAS       TV_SIZE 
     IS_EXPENSIVE CLASIFICATION 

Où moyen serait discrimine entre bateau et voiture et est coûteuse serait discriminatoire bettwen cher ou pas cher. Donc, y a-t-il un moyen d'y parvenir avec les capacités d'héritage fournies par OpenJPA (je sais qu'Hibernate peut utiliser des formules discriminantes mais j'essaie de ne pas passer du fournisseur JPA par défaut).

En prime, si vous pouvez me parler de la coutume discriminator strategies de OpenJPA qui serait super car j'ai le pressentiment que cela pourrait être une solution plausible (même si je préférerais un fournisseur un indépendant)

Merci beaucoup

Répondre

0

Commençons par reculer.

Les stratégies de discriminateur définissent le type de colonne qui différencie les entités associées dans la hiérarchie. Dans JPA 1.x, il peut s'agir d'une chaîne (c'est la valeur par défaut), d'un caractère et d'un nombre entier. Exemple:

import javax.persistence.DiscriminatorType; 
import javax.persistence.DiscriminatorValue; 
import javax.persistence.Entity; 

@Entity 
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING, length = 5) 
@DiscriminatorValue("FOO") 
public class Foo { ... } 

@Entity 
@DiscriminatorValue("BAR") 
public class Bar extends Foo { ... } 

@Entity 
@DiscriminatorValue("BAZ") 
public class Baz extends Baz { ... } 

Si vous utilisez est la stratégie d'héritage de table unique comme la valeur par défaut, cette configuration signifie que toutes ces entités qui sont dans la hiérarchie seront mises en correspondance à la table de base de données de la classe parente, qui signifie que vous » ll aura une table FOO dans votre db avec tous les attributs des classes Foo, Bar et Baz plus une colonne discriminante appelée TYPE avec le type de chaîne (très probablement varchar-variant, longueur 5) et pour chaque type d'entité, le discriminateur respectif La valeur sera insérée automatiquement si persisté. Lorsque vous trouvez des entités Bar ou Baz avec JPQL, JPA pourra trouver les entités de la table FOO (car c'est la table de l'entité parente), et en s'appuyant sur le contenu de la colonne discriminante, votre APP Le fournisseur sera en mesure de faire la distinction entre la création de certaines entités Bar ou Baz. Si vous définissez le type de discriminateur sur INTEGER ou CHAR, vous pouvez écrire pour les valeurs 1, 2, 3 ou "A", "B", "C" etc. respectivement.

Maintenant à la question OpenJPA. Je n'ai aucun moyen de spécifier facilement des valeurs discriminantes multiples avec OpenJPA, mais vous pouvez créer des hiérarchies d'entités plus complexes, donc si vous pouviez modifier le schéma, vous pourriez créer une entité Vehicle, une voiture, un Bateau et à la fois un ExpensiveBoat et un ExpensiveCar. Je suppose (mais FIXME) que vous utilisez la stratégie d'héritage jointe ou table par classe, ce qui signifie que vous ne pouvez pas utiliser la fonction discriminante fournie par JPA.

+0

Il n'est pas obligatoire d'utiliser la stratégie jointe ou table_per_class lorsque vous n'avez pas accès au schéma, mais ce sont souvent les seules stratégies qui ont du sens. – Monachus

+0

En effet, vous avez raison. –

Questions connexes