继承的Gorm映射

时间:2013-12-30 12:22:37

标签: grails gorm grails-domain-class

我正面临Grails继承问题。 我有一个域类Person.grooy:

class Person{
    String name
    String contactNumber
    Address address
} 

现在,我正在为员工和客户扩展Person.groovy,如:

class Employee extends Person{
    String designation
}
class Customer extends Person{
    String interest
}

现在我想在我的数据库中为Employee和Customer提供单独的表,其中包含Person列,即姓名,联系人姓名和关联地址密钥。 我怎么能实现这一点。我搜索过每一个地方,但这方面没什么。 这种方法在GORM中是不可能的吗? 请回答。 谢谢大家

6 个答案:

答案 0 :(得分:5)

最后,我设法通过在我的子域类中放置grails.persistence.Entity注释来获得我想要的内容。我也让我的父亲,即Person.groovy摘要并放在src / groovy。

现在我有了预期的数据库层次结构,但控制器中的一些脚手架问题仍然存在,并且会在你的帮助下整理出来。

答案 1 :(得分:3)

您需要禁用table-per-hierarchy,默认情况下在Grails中启用

class Employee extends Person{
    String designation

static mapping = {
        tablePerHierarchy false
    }
}

table-per-hierarchy Ref

答案 2 :(得分:3)

如果将Person类放在src / java或src / groovy中,它将不会映射到db。

请记住将其导入您的员工和客户类

import com.yourPackage.Person

class Employee extends Person{

}

答案 3 :(得分:1)

你可以将它放在src / java中,但是这个解决方案不是标准的,因为一旦你深入了解应用程序,它就不会被视为grails域的例子。

例如,如果您想根据上一个答案在扩展域上创建控制器或测试脚本,那将会很复杂。

截至Grails 2.2.x我相信,grails为您提供 mapWith 。您可以使用它来获得更易于维护的解决方案

class Employee{
static mapWith = "none"
}

答案 4 :(得分:1)

看起来继承不是我们需要遵循的方法。您应该使用Person类创建合成,它将在Employee中存储Person类的属性。

class Employee {
    Person person
    String designation

    static embedded = ['person']
}

Gorm Composition

答案 5 :(得分:0)

也可以使用 @Delegate 注释,正如 groovy 文档所述:

<块引用>

[...] 自动将所有者类的部分功能委托给 带注释的委托目标。

[...] 委托类型中存在但所有者类中不存在的所有公共实例方法都将在编译时添加到所有者类中。

您必须将用作委托的类放置在 src/groovy 处,否则 Grails 也会为委托创建方法,它会覆盖所有者类的 Gorm 方法(我尝试使用 static mapWith = 'none' 但它不起作用).

使用 @Delegate 的优点是不必像使用 embedded 那样输入对象的名称。另一个优势是可重用性,因为您可以拥有多个这样的委托对象。

grails-app/domain

class Employee {
    @Delegate Person person
    String designation

    static transients = ['person']
}

注意 transients 静态属性。它告诉 Gorm 不要将对象持久化到数据库中。 否则它会给我们一个错误或者它会根据 dbCreate 的设置持久化关系。

src/groovy

class Person {
    String name
    String contactNumber
    Address address
}