2010-11-15 5 views
0

TousGORM 1-à-plusieurs - 3 tables créées plutôt que 2

Mon problème est que je suis en train de créer un 1-à-plusieurs dans Gorm et attendre 2 tables de base de données à créer sous forme d'objets de support . 3 sont créés ce qui rend les requêtes SQL trop complexes.

J'ai créé une variante proche du 1 à plusieurs dans la documentation GORM:

class Status { 

    List errorMessage 

    static hasMany = [errorMessage:ErrorMessage] 
} 

et la classe de message d'erreur:

class ErrorMessage { 

    String message 

    static belongsTo = Status 
} 

Je m'y attendais pour créer deux bases de données tables:


CREATE TABLE status { 
    ID NUMBER(19,0), 
    VERSION NUMBER(19,0), 
    //other fields 
} 

CREATE TABLE error_message { 
    ID NUMBER(19,0), 
    VERSION NUMBER(19,0), 
    STATUS_ID NUMBER(19,0), 
    MESSAGE VARCHAR(255) 
    //other fields 
} 

mais en fait il veut une troisième table,



CREATE TABLE status_text { 
    status_text_id NUMBER(19,0), 
    text_idx NUMBER(19,0), 
    text_id NUMBER(19,0) 
} 

Ajout d'état à la ErrorMessage (un hack que je ne veux pas ErrorMessage d'avoir une référence au statut) classe supprime la troisième table mais conserve la deuxième clé étrangère entraînant l'objet enfant de texte ayant deux domaines clés étrangers . Ce que je veux est simple - juste un ensemble d'objets attachés au parent sera supprimé quand il est - des pensées que je fais mal?

Merci

+0

Si vous ne voulez pas faire référence '' status' dans ErrorMessage' (sauf de 'belongsTo', bien sûr), la table de jointure est nécessaire ... – robbbert

Répondre

0

Je ne pense pas que vous pouvez satisfaire à ces deux exigences, à savoir que vous avez en cascade et ne supprime table de jointure. Vous avez besoin du belongsTo pour obtenir des suppressions en cascade et cela rend la relation bidirectionnelle. Pour retirer la table de jointure, nommez le belongsTo avec la syntaxe de la carte:

class ErrorMessage { 
    String message 
    static belongsTo = [status: Status] 
} 
+0

Je vais essayer - et répondre. Merci – Alex

+0

Une note de côté, l'effet de GORM sur la création/l'attente d'une table JOIN (ou non) lors de l'utilisation de la syntaxe 'Map' vs' Type' ne semble pas être documenté dans le * Grails User Guide * ... – robbbert

+0

Cela a fonctionné. cliquera sur la coche. Seul bizarrement mineur est qu'il m'a demandé d'ajouter un nouveau champ db qui semble faire référence à la table enfant (ou le champ en son sein du même nom). Cela a la valeur 0 pour chaque insertion. Toujours - enlevé la table de lien. Merci beaucoup. – Alex