Grails 用于继承的Gorm映射

Grails 用于继承的Gorm映射,grails,gorm,grails-domain-class,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 int

我面临一个关于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
}
现在,我希望在数据库中为员工和客户创建一个单独的表,其中包含人员列,即姓名、联系人号码和关联地址键。 我怎样才能做到这一点。我到处找,但这方面什么都没有。 这一方法在GORM中是不可能的。 请回答。
谢谢大家

您需要禁用每个层次的表,这在Grails中是默认启用的

class Employee extends Person{
    String designation

static mapping = {
        tablePerHierarchy false
    }
}

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

请记住将其导入到Employee和Customer类中

import com.yourPackage.Person

class Employee extends Person{

}

您可以将其放在src/java中,但该解决方案将不是标准的,因为一旦深入应用程序,它实际上不会被视为grails域示例

例如,如果您希望按照前面的答案在扩展域上创建控制器或测试脚本,那么这将非常复杂

我相信,从Grails2.2.x开始,grails为您提供了mapWith。您可以将其用于更易于维护的解决方案

class Employee{
static mapWith = "none"
}

最后,我只需在我的子域类中放置一个
grails.persistence.Entity
注释,就可以得到我想要的东西。我还将我的父对象Person.groovy抽象并放在src/groovy中


现在我有了我所期望的数据库层次结构,但controller中的一些脚手架问题仍然存在,在您的帮助下也会得到解决。

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

class Employee {
    Person person
    String designation

    static embedded = ['person']
}

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

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

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

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

如果使用
embedded
,则不必键入对象的名称。另一个优点是可重用性,因为您可以有多个这样的委托对象

在grails应用程序/域的

class Employee {
    @Delegate Person person
    String designation

    static transients = ['person']
}
注意静态属性。它告诉Gorm不要将对象持久化到数据库。否则它将给我们一个错误,或者它将根据的设置持久化关系

at
src/groovy

class Person {
    String name
    String contactNumber
    Address address
} 

是的,我已经试过了。它将为每个域类分别创建一个表,就像为每个人创建一个表一样,它有三列名称、联系人号码、地址id,在员工表中有一列用于指定。在Customer表中还有一列表示兴趣。我希望Employee表应该有列名、联系人号码、地址id和名称。而且不应该有人坐的桌子。Groovyys我试了所有方面。将父类Person.groovy放在src/groovy中,并将它们导入子类,但数据库中并没有映射。我还尝试将域类作为抽象类,然后进行扩展,但没有成功。谢谢你的时间和考虑。希望我们能找到解决方案。:)