Grails gorm如何在每个具体类继承抽象类的位置为每个具体类插入表

Grails gorm如何在每个具体类继承抽象类的位置为每个具体类插入表,grails,gorm,Grails,Gorm,大家好,情况如下 我有一个抽象类AbstractProfile和一个具体类GoogleProfile abstract class AbstractProfile { ..... } class GoogleProfile extends AbstractProfile { ...... } 我正在使用grails,但gorm没有为google概要文件插入表当前gorm只为AbstractProfile类插入表请提前帮助谢谢grails 2.0持久化抽象类。为了向扩展类

大家好,情况如下 我有一个抽象类AbstractProfile和一个具体类GoogleProfile

abstract class AbstractProfile  {
    .....
}

class GoogleProfile extends AbstractProfile { 

    ......
}

我正在使用grails,但gorm没有为google概要文件插入表当前gorm只为AbstractProfile类插入表请提前帮助谢谢

grails 2.0持久化抽象类。为了向扩展类启用单个表,需要指定:

static mapping = {
        tablePerHierarchy       false
}

到抽象类。否则,整个层次结构将“活”在同一个表中。

Grails2.0持久化抽象类。为了向扩展类启用单个表,需要指定:

static mapping = {
        tablePerHierarchy       false
}

到抽象类。否则,整个层次结构将“活”在同一个表中。

我做了一些挖掘,发现从开始,您有以下映射选项:

tablePerConcreteClass true

似乎文档(即使是版本)还没有更新。我做了一些挖掘,发现从开始,您有以下映射选项:

tablePerConcreteClass true
文档(即使是版本)似乎还没有对此进行更新。

您可以使用:

abstract class BaseDomain {
            static mapping = {
                tablePerConcreteClass true
                id generator: 'increment'
                version false
            }
    }
您可以使用以下选项:

abstract class BaseDomain {
            static mapping = {
                tablePerConcreteClass true
                id generator: 'increment'
                version false
            }
    }

继Маааа的伟大回答之后,有两件事对我起了作用

  • 将基域类放入src
  • 这对我来说效果最好,因为应用了来自基类和子类的约束。子类中没有空列对于我的用例很重要。但是,似乎只使用子类中的映射块

  • 使用
    tablePerConcreteClass true
  • 这里的一个优点是它允许在BaseDomain类中声明一个索引,然后该索引出现在每个子类表中,即使用来自基类和子类的映射块。似乎只使用基类中的约束

    abstract class BaseDomain {
        static mapping = {
            tablePerHierarchy false  // avoid creating the base_domain table
            tablePerConcreteClass true
            id generator: 'increment' // https://jira.grails.org/browse/GRAILS-10849
            someColumnInBaseDomain index: true  // index this column in each subclass table
        }
    }
    

    继Маааа的伟大回答之后,有两件事对我起了作用

  • 将基域类放入src
  • 这对我来说效果最好,因为应用了来自基类和子类的约束。子类中没有空列对于我的用例很重要。但是,似乎只使用子类中的映射块

  • 使用
    tablePerConcreteClass true
  • 这里的一个优点是它允许在BaseDomain类中声明一个索引,然后该索引出现在每个子类表中,即使用来自基类和子类的映射块。似乎只使用基类中的约束

    abstract class BaseDomain {
        static mapping = {
            tablePerHierarchy false  // avoid creating the base_domain table
            tablePerConcreteClass true
            id generator: 'increment' // https://jira.grails.org/browse/GRAILS-10849
            someColumnInBaseDomain index: true  // index this column in each subclass table
        }
    }
    


    我使用的grails版本是2.0.4我使用的grails版本是2.0.4静态映射={tablePerHierarchy:false}Hello heikkim我已经将此映射插入到我的抽象类中,但仍然是相同的结果在“tablePerHierarchy”和“false”之间的定义中有一个额外的冒号。感谢heikkin,它对我有效,但现在当我想将google profile的一个实例保存到db时,会生成以下错误|错误2012-08-03 12:52:41748[pool-15-thread-2]错误hibernate.AssertionFailure-发生断言失败(这可能表明hibernate中存在错误,但更可能是由于会话的不安全使用)消息:com.test.demo.GoogleProfile条目中的null id(发生异常后不要刷新会话)在添加tablePerHierarchy false之前是否删除了旧表结构?实际上,在用于开发的Datasource.groovy文件中,我正在使用create drop,每次服务器启动db structure recreatedstatic mapping={tablePerHierarchy:false}Hello heikkim我已将此映射插入我的抽象类,但结果仍然相同您在定义中有一个额外的冒号,位于“tablePerHierarchy”和“false”之间。感谢heikkin,它对我有效,但现在当我想将google profile的一个实例保存到db时,会生成以下错误|错误2012-08-03 12:52:41748[pool-15-thread-2]错误hibernate.AssertionFailure-发生断言失败(这可能表明hibernate中存在错误,但更可能是由于会话的不安全使用)消息:com.test.demo.GoogleProfile条目中的null id(发生异常后不要刷新会话)在添加tablePerHierarchy false之前是否删除了旧的表结构?实际上,在我的Datasource.groovy开发文件中,我正在使用create drop,每次服务器启动db structure时,重新创建一点对该代码的解释将有助于将来的读者。为了避免创建基域表,我还需要tablePerHierarchy:false。我发现使用tablePerConcreteClass而不是将基域类放在src中的好处是,我可以在基域类中索引列。@gabe感谢我在这里创建了一个答案,解释您的意思-作为其他人的参考点。对这段代码的一点解释将对您有所帮助未来的读者。为了避免创建基域表,我还需要tablePerHierarchy:false。我发现使用tablePerConcreteClass而不是将基域类放在src中的优点是,我可以索引基域类中的列。@gabe谢谢,我在这里创建了一个Answer来解释您的意思-作为参考点为他人