2010-05-14 3 views
2

У меня есть два домена:Как заставить grails GORM уважать схему БД?

class CodeSet { 

    String id 
    String owner 
    String comments 
    String geneRLF 
    String systemAPF 

    static hasMany = [cartridges:Cartridge] 

    static constraints = { 
     id(unique:true,blank:false) 
    } 

    static mapping = { 
     table 'code_set' 
     version false 
     columns { 
     id column:'code_set_id', generator: 'assigned' 
     owner column:'owner' 
     comments column:'comments' 
     geneRLF column:'gene_rlf' 
     systemAPF column:'system_apf' 
     } 
    } 

and : 

class Cartridge { 

    String id 
    String code_set_id 
    Date runDate 

    static belongsTo = CodeSet 

    static constraints = { 
     id(unique:true,blank:false) 
    } 

     static mapping = { 
     table 'cartridge' 
     version false 
     columns { 
     id column:'cartridge_id', generator: 'assigned' 
     code_set_id column:'code_set_id' 
     runDate column:'run_date' 
     } 
    } 

На самом деле, с теми моделями, которые я получаю таблицы:
- code_set,
- картридж,
- и стол: code_set_cartridge (два поля: code_set_cartridges_id, cartridge_id)

Я хотел бы, чтобы не иметь code_set_cartridge таблицы, но сохранить отношения:
code_set -> 1: п -> картриджа

Другими словами, как я могу поддерживать связь между code_set и картриджем без промежуточной таблицы? (используя code_set_id как первичный ключ в code_set и code_set_id как внешний ключ в картридже).

Сопоставление с GORM может осуществляться без промежуточной таблицы?

ответ

5

Он работает, если вы изменили объявление applyTo. Вместо того, чтобы просто ссылаться на идентификатор CodeSet, вы можете назвать экземпляр в attributeTo, и вы получите ссылку на экземпляр и избегаете таблицы join. Я также удалил избыточные сопоставления:

class Cartridge { 

    String id 
    Date runDate 

    static belongsTo = [codeSet: CodeSet] 

    static mapping = { 
     version false 
     id generator: 'assigned' 
     codeSet column:'code_set_id' 
    } 
} 

class CodeSet { 

    String id 
    String owner 
    String comments 
    String geneRLF 
    String systemAPF 

    static hasMany = [cartridges:Cartridge] 

    static mapping = { 
     version false 
     id generator: 'assigned' 
     geneRLF column:'gene_rlf' 
     systemAPF column:'system_apf' 
    } 
} 
+0

С помощью однонаправленного режима также нет промежуточной таблицы. Но я путаюсь с двунаправленным и однонаправленным режимом. В каком случае я должен использовать двунаправленный и однонаправленный режим? Пример ? Спасибо –

+0

Решение действительно сводится к тому, что вы хотите иметь доступ к сопоставленному набору и ссылке, или просто ссылку. Мое предпочтение является однонаправленным, так как вы всегда можете найти экземпляры CodeSet, которые ссылаются на картридж через «CodeSet.findAllByCartridge (this)» или «CodeSet.findAllByCartridge (картридж)». –

+0

В вашем примере вы используете однонаправленный режим? Правильно ? Используя «Картриджный картридж», у меня также есть однонаправленный режим. В чем разница ? Является ли однонаправленный режим и двунаправленный режим влиять на организацию таблицы db? –

1

Я использовал двунаправленный режим «один ко многим», но я также могу использовать однонаправленный режим.

Таким образом, для домена Codeset, данное исправление:

class CodeSet { 

    String id 
    String owner 
    String comments 
    String geneRLF 
    String systemAPF 

    Cartridge cartridge 

    static constraints = { 
     id(unique:true,blank:false) 
    } 

    static mapping = { 
     table 'code_set' 
     version false 
     id column:'code_set_id', generator: 'assigned' 
     columns { 
     owner:'owner' 
     comments:'comments' 
     geneRLF:'gene_rlf' 
     systemAPF:'system_apf' 
     } 
    } 

Но я до сих пор путаю с двунаправленным и однонаправленным режимом?
Кто-нибудь, может показать мне хороший пример (чтобы помочь мне понять)? Thanks