2011-06-14 3 views
1

Quelle est la meilleure façon de mapper deux entités dans GORM lorsque la clé primaire d'une table est également une clé étrangère d'une autre table. Ex:Comment mapper des entités dans GORM lorsque pk d'une référence pk d'une autre

Voici une table:

CREATE TABLE `table_a` (
`a_id` int(11) NOT NULL AUTO_INCREMENT, 
PRIMARY KEY (`a_id`) 
) 

Et le pk de cette table 'a_id' est référencé par le tableau suivant:

CREATE TABLE `table_b` (
`b_id` int(11) NOT NULL AUTO_INCREMENT, 
PRIMARY KEY (`b_id`), 
KEY `b_id_fk` (`b_id`), 
CONSTRAINT `b_id_fk` FOREIGN KEY (`b_id`) REFERENCES `table_a' (`a_id`) 
) 

Comment puis-je mapper les deux entités ci-dessus dans Grails/GORM? Le code suivant ne fonctionnera évidemment pas puisque GORM lancera une exception en disant "colonne répétée dans le mapping pour l'entité".

class TableB { 

TableA tableA 
static belongsTo = [TableA] 

static mapping = { 
    id column:"b_id" 
    version false 
    tableA column:"b_id" 
} 

static constraints = { 
    tableA unique: true 
} 
} 

Note: J'utilise Grails 1.3.7 mais peut passer à une version plus récente si ce problème est un problème qui a récemment été fixée. S'il vous plaît, faites-moi savoir.

+0

pouvez-vous changer le schéma ou devez-vous avoir la clé primaire aussi le fk? – hvgotcodes

+0

Je sais que le schéma n'est pas conforme aux meilleures pratiques. Mais c'est une base de données héritée que je ne peux pas changer. – sul

Répondre

2

Je ne sais pas si cela s'applique à votre cas, mais une chose que vous pouvez faire est de mapper TableB en tant que sous-classe de TableA en utilisant la stratégie d'héritage de table par sous-classe. Vérifiez Inheritance Strategies dans le guide Grails.

Alors, vous auriez:

class TableA { 
    static mapping = { 
     id column: 'a_id' 
     table 'table_a' 
     version false 
     tablePerHierarchy false 
    } 
} 

class TableB extends TableA { 
    static mapping = { 
     id column: 'b_id' 
     table 'table_b' 
     version false 
    } 
} 

Le problème avec cette approche est que vous ne pouvez pas créer un objet TableB après avoir créé l'objet TableA. La façon dont Hibernate fonctionne, lorsque vous créez une nouvelle instance TableA, un enregistrement dans table_a est créé. Lorsque vous créez une nouvelle instance TableB, un enregistrement dans table_a et un enregistrement dans table_b sont créés avec le même ID. OTOH, Je ne peux pas penser à une raison valable pour ce schéma autre que le mappage d'une hiérarchie de classe comme celle-ci.

+0

Oui, vous avez raison, c'est l'utilisation de la stratégie d'héritage de table par sous-classe. J'ai testé ce paramètre que l'indicateur tablePerHierarchy à false le fait fonctionner comme prévu. Merci de votre aide! – sul