【问题标题】:grails joinTable with legacy databasegrails joinTable 与旧数据库
【发布时间】:2011-07-23 07:24:43
【问题描述】:

我有一个要使用 grails 进行的一对多表映射。我有一个无法更改表结构的旧数据库。我已经设置好了所有东西,但我唯一不知道的是如何让 grails 注意到现有的外键而不是创建它自己的列。我有这样的东西(简化):

class Customer {
    String listID
    String name
    String address
    // more fields etc.

    static hasMany [notes : Note]

    static mapping = {
        table name:"customers"
        id name:"listID",generator:"assigned"

        // doesn't work, creates a foreign key column in customer_notes table
        // with key: customer_id. I want it to just use the existing column
        // CustomerListID, which has the correct foreign key
        notes joinTable:[name:"customer_notes",key:"CustomerListID"]            
    }
}

class Note {
    String noteID
    String customerListID

    static mapping = {
        table name:"customer_notes"
        id name:"NoteID",generator:"assigned"
     }
}

作为旁注,我看到 grails 文档中的 joinTable 说“column”是反列,“key”是外键。文档中的示例没有帮助。我有“Grails in Action”,它说它将提供一个一对多的例子,然后显示一个多对多的例子,无论哪种方式,它似乎都不是一个完整的例子(模型的一半缺失) !

有什么想法吗?我有这个遗留数据库,我打算以只读方式使用它。我只是希望 O/R 映射器能够很好地将事物连接在一起。

【问题讨论】:

    标签: hibernate grails grails-orm


    【解决方案1】:

    您在 Customer 域对象中的 joinTable 应该使用列,而不是键:

    notes joinTable:[name:"CustomerNotes",column:"CustomerListID"]
    

    另外,name: 应该是连接表的名称,而不是 Note 表的名称。

    【讨论】:

    • 我的问题中有一个错字(正如你指出的那样,我的模型不正确。它仍然不能像现在所说的那样工作。我不明白你的最后一部分,关于“名称:应该是连接表的名称。customer_notes 不是连接表吗?
    • 我对您的域模型有点困惑。我对您的域的理解,您需要三个表:customers、customer_notes 和第三个连接表。您的域表不需要域对象。
    • 您的意思是我的联接表不需要域对象吗?事实证明,没有第三张桌子。客户备注中的主键是 NoteID,它有一个外键 CustomerListID。所以可能你的意思是我不需要customer_notes 中的CustomerListID 列,因为那是grails 会自动创建的。如果是这样就好了。但问题是,无论我做什么 grails 都会创建 customer_id 作为外键列。
    • 根据您对表的描述,您没有连接表。您只需要指定外键的名称。将 joinTable 行替换为:notes: column:customer_list_id。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多