hibernate - 当一个人的pk引用另一个人的pk时,如何在GORM中映射实体

标签 hibernate grails groovy grails-orm grails-domain-class

当一个表的主键也是另一个表的外键时,在 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,除了像这样的类层次结构的映射之外,我想不出该模式的正当理由。

关于hibernate - 当一个人的pk引用另一个人的pk时,如何在GORM中映射实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6351389/

相关文章:

database - HBM2DDL——创建数据库 View 而不是表?

grails - 如何让Grails忽略.DS_Store

java - 不使用主键检查 uniq 约束

java - 来自 ant 在 linux 中构建的 java 类的数据库

使用接口(interface)定义spring bean

java - 使用 app.context 时 Grails 重定向到错误的地址?

grails - 通过g:每次迭代将值传递给输入

groovy - Groovy 中 static 和 final 修饰符的使用

java - 如何在hibernate中不继承Id generatedValue(在子类中禁用@GenerateValue)

grails - 是否可以使用watchedResources 观察Config.groovy 的变化?