当一个实体的pk引用另一个的pk时,我如何映射GORM中的实体



当一个表的主键也是另一个表中的外键时,在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的子类。查看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
    }
}

这种方法的问题在于,在创建了TableA对象之后,无法创建TableB对象。按照Hibernate的工作方式,当您创建一个新的TableA实例时,就会在table_a中创建一条记录。当您创建一个新的TableB实例时,table_a中的一条记录和table_b中的一个记录都会创建,具有相同的id。

OTOH,除了映射这样的类层次结构之外,我想不出有什么合理的理由来使用这种模式。

最新更新