Grails单向一对多关联无需连接表是否可行?配置后仍生成连接表疑问
Grails单向一对多关联:避免生成连接表失败问题
我按照官方文档配置Grails单向一对多关联,要求不创建连接表,但系统仍生成了连接表,疑惑这是Bug还是我的理解有误。
我使用的代码
class Person { String bookName static hasMany = [addresses: Address] static mapping = { addresses column: 'person_address_id' } } class Address { String address static constraints = { } }
生成的表结构
系统生成了三张表:person、address,以及用于关联的连接表person_address(EER模型显示该连接表包含person_id和address_id两个字段)。
注意:application.yml中配置了datasource.dbCreate: create-drop。
问题原因及解决方案
这不是Grails的Bug,是你的配置方式有误。默认情况下,Grails的单向一对多关联会使用连接表实现;若要改用子表外键关联(不生成连接表),必须在子实体(Address)中定义指向父实体(Person)的外键字段/属性,同时在父实体的映射配置中指定该外键列。
正确配置示例
方式1:手动定义外键字段
修改Address类添加对应外键字段,同时调整Person的映射配置:
// Person类 class Person { String bookName static hasMany = [addresses: Address] static mapping = { // 指定关联使用Address表中的person_id外键列,禁用连接表 addresses column: 'person_id', joinTable: false } } // Address类 class Address { String address // 对应外键字段,名称需与Person中mapping的column一致 Long personId static constraints = { personId nullable: true // 根据业务需求设置是否允许为空 } }
方式2:通过实体属性自动生成外键
在Address中定义Person类型的属性(无需设置belongsTo,保持单向关联),Grails会自动生成外键列:
// Person类 class Person { String bookName static hasMany = [addresses: Address] static mapping = { // 指定关联使用Address表中的person_id外键列 addresses column: 'person_id' } } // Address类 class Address { String address // 定义Person属性,无需belongsTo,保持单向 Person person static constraints = { person nullable: true } }
效果验证
配置完成后重新启动应用,系统会在address表中生成person_id外键列,不再生成person_address连接表。
内容的提问来源于stack exchange,提问作者vicky
相关产品推荐
相关产品推荐

