Mysql GRAILS:使用域子类

Mysql GRAILS:使用域子类,mysql,grails,inheritance,table-per-hierarchy,Mysql,Grails,Inheritance,Table Per Hierarchy,在以下版本中使用Grails: APPLICATION STATUS App version: 0.1 Grails version: 2.3.5 Groovy version: 2.1.9 JVM version: 1.7.0_51 Reloading active: true Controllers: 15 Domains: 18 Services: 2 Tag Libraries: 13 我有一个领域模型,我正试图遵循。在编程之前,我在MySQL中构建了表。 在这个模型中,我有一个插入顺

在以下版本中使用Grails:

APPLICATION STATUS
App version: 0.1
Grails version: 2.3.5
Groovy version: 2.1.9
JVM version: 1.7.0_51
Reloading active: true
Controllers: 15
Domains: 18
Services: 2
Tag Libraries: 13
我有一个领域模型,我正试图遵循。在编程之前,我在MySQL中构建了表。
在这个模型中,我有一个插入顺序,它绑定到多对多关系中的人。此关系由插入顺序人员定义,人员id和位置id在插入顺序人员中定义一个条目。此外,还有一个类型值,可以枚举贩运者、广告商、代理商或销售人员。一个(或多个)贩运者总是会出现,但其他人可能会、可能不会或有很多这样的联系。我正在尝试根据插入顺序模型的类型将其绑定:

package cms


class Insertion_orders {
    String insertion_order_name
    String po_number
    String notes
    String toString() {
        "${insertion_order_name} - ${id}"
    }

    static hasMany = [trafficker: Insertion_orders_traffickers, salesperson: Insertion_orders_salespersons]

    static constraints = {
        insertion_order_name(blank:false)
        po_number()
        notes(widget: 'textarea', nullable:true)
    }
    static mapping ={
        version false
        id column: 'insertion_order_id'
        notes sqlType: 'text'
    }
}
我正试图使用继承和一个discrimiator值来实现这一点

package cms

class Insertion_orders_persons {
    Persons person
    Insertion_orders insertion_order
    Type type
    String toString() {
        "${person}: ${type}"
    }

    enum Type {
        Trafficker, Salesperson, Advertiser, Agency
    }

    static constraints = {
    }
    static mapping = {
        version false
        id column: 'insertion_order_person_id'
        discriminator column: "type"        
    }

}

class Insertion_orders_traffickers extends Insertion_orders_persons {
    static mapping ={
        discriminator value: "Traffickers"
    }
}

class Insertion_orders_salespersons extends Insertion_orders_persons {
    static mapping ={
        discriminator value: "Salesperson"
    }
}
问题是,当我尝试加入扩展类时(如在Insertion_orders类中的hasMany),Grails无法启动并生成以下内容:

|Loading Grails 2.3.5
|Configuring classpath
.
|Environment set to development
.................................
|Packaging Grails application
..........................................
|Running Grails application
Error |
2014-04-16 11:33:58,693 [localhost-startStop-1] ERROR context.GrailsContextLoader  - Error initializing the application: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: Association references unmapped class: cms.Insertion_orders_salespersons
Message: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: Association references unmapped class: cms.Insertion_orders_salespersons
    Line | Method
->>  262 | run       in java.util.concurrent.FutureTask
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    615 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^    744 | run       in java.lang.Thread
Caused by BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: Association references unmapped class: cms.Insertion_orders_salespersons
->>  262 | run       in java.util.concurrent.FutureTask
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    615 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^    744 | run       in java.lang.Thread
Caused by BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: Association references unmapped class: cms.Insertion_orders_salespersons
->>  262 | run       in java.util.concurrent.FutureTask
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    615 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^    744 | run       in java.lang.Thread
Caused by MappingException: Association references unmapped class: cms.Insertion_orders_salespersons
->>  262 | run       in java.util.concurrent.FutureTask
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    615 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^    744 | run       in java.lang.Thread
Error |
Forked Grails VM exited with error
作为附加信息,无论我如何尝试访问子类或子类的组成,我都会得到相同的错误


这似乎是一个非常基本的功能。有人能告诉我我遗漏了什么或做得不对吗

如果从插入订单人员中删除鉴别器列:“键入”,并在各自的源文件中定义插入订单人员、插入订单贩运者和插入订单销售人员,我认为您的代码可以正常工作。

我认为这不会解决问题,但为什么您在域类中使用snake-case格式而不是camel-case?>我怀疑这与您的数据源和数据库映射有关?danielad的想法不错。我使用默认数据源(即内存中的h2)创建了一个全新的Grails项目,重建了所有3个域类,并添加了几个带有动态支架的控制器。生成了相同的错误消息。对我来说是这样的。如果您可以将一个示例项目发布到github,演示您所看到的内容,我将很乐意查看它。那个代码似乎有效。很抱歉,你是对的。除了类列之外,是否还可以使用其他值?在类型i中留下一个错误,以“由映射异常引起:实体映射中的重复列:cms.Insertion\u orders\u trackers列:Type(应使用insert=“false”update=“false”映射)结尾| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor | 615 | run…in java.util.concurrent.ThreadPoolExecutor$Worker^744 | run in java.lang.Thread Error | Forked Grails VM退出时出错>是否仍要使用某些值“other”“比班级专栏好吗?我不知道你这是什么意思。你想实现什么?我不知道你在问什么,但我认为我先前的建议解决了这里描述的原始问题。看见这有用吗?如果你不让我知道你想要完成什么。