当一个表的主键也是另一个表的外键时,在 GORM 中映射两个实体的最佳方法是什么。例如:
这是一张表:
CREATE TABLE `table_a` (
`a_id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`a_id`)
)
而这张表'a_id'的pk被下表引用:
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`)
)
如何在 Grails/GORM 中映射上述两个实体?下面的代码显然不会工作,因为 GORM 会抛出异常,说“实体映射中的重复列”。
class TableB {
TableA tableA
static belongsTo = [TableA]
static mapping = {
id column:"b_id"
version false
tableA column:"b_id"
}
static constraints = {
tableA unique: true
}
}
注意:我使用的是 grails 1.3.7,但如果此问题是最近修复的问题,可以切换到较新的版本。请告诉我。
请您参考如下方法:
我不知道它是否适用于您的情况,但您可以做的一件事是映射 TableB作为 TableA 的子类使用 table-per-subclass 继承策略。查看Inheritance Strategies在 Grails 指南中。
所以,你有:
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
}
}
这种方法的问题是您无法创建
TableB创建
TableA 后的对象目的。当您创建一个新的
TableA 时,Hibernate 的工作方式例如,
table_a 中的一条记录被 build 。当你创建一个新的
TableB例如,
table_a 中的记录和
table_b 中的记录被创建,具有相同的 id。
OTOH,除了像这样的类层次结构的映射之外,我想不出该模式的正当理由。




