【问题标题】:How do I map entities in GORM when pk of one references pk of another当一个人的pk引用另一个人的pk时,如何在GORM中映射实体
【发布时间】:2011-09-15 03:14:52
【问题描述】:

当一个表的主键也是另一个表的外键时,在 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,但如果此问题是最近修复的问题,我可以切换到更新的版本。请告诉我。

【问题讨论】:

  • 您可以更改架构还是必须让主键也是 fk?
  • 我知道架构不符合最佳实践。但这是一个我无法更改的遗留数据库。

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


【解决方案1】:

我不知道它是否适用于您的情况,但您可以做的一件事是使用 table-per-subclass 继承策略将 TableB 映射为 TableA 的子类。在 Grails 指南中查看Inheritance Strategies

所以,你有:

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,除了像这样的类层次结构的映射之外,我想不出该架构的正当理由。

【讨论】:

  • 是的,你是对的,这是使用 table-per-subclass 继承策略。我已经测试过将 tablePerHierarchy 标志设置为 false 可以使其按预期工作。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 2011-07-18
相关资源
最近更新 更多