GORM关系中的抽象类

Vis*_*ons 5 orm grails inheritance abstract-class grails-orm

Grails GORM不会将抽象域类持久保存到数据库中,从而导致多态关系中断.例如:

abstract class User {
    String email
    String password
    static constraints = {
        email(blank:false, nullable:false,email:true)
        password(blank:false, password:true)
    }

    static hasMany = [membership:GroupMembership]
}

class RegularEmployee extends User {}

class Manager extends User {
    Workgroup managedGroup
}

class Document {
    String name
    String description
    int fileSize
    String fileExtension
    User owner
    Date creationTime
    Date lastModifiedTime
    DocumentData myData
    boolean isCheckedOut
    enum Sensitivity {LOW,MEDIUM,HIGH}
    def documentImportance = Sensitivity.LOW

    static constraints = {
        name(nullable:false, blank:false)
        description(nullable:false, blank:false)
        fileSize(nullable:false)
        fileExtension(nullable:false)
        owner(nullable:false)
        myData(nullable:false)
    }
}
Run Code Online (Sandbox Code Playgroud)

原因

引起:org.hibernate.MappingException:表文档中的关联引用了未映射的类:User ... 25 more 2009-11-11 23:52:58,933 [main] ERROR mortbay.log - 嵌套在org.springframework中.beans.factory.BeanCreationException:创建名为'messageSource'的bean时出错:bean的初始化失败; 嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名为'transactionManager'的bean时出错:在设置bean属性'sessionFactory'时无法解析对bean'sessionFactory'的引用; 嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名为'sessionFactory'的bean时出错:init方法的调用失败; 嵌套异常是org.hibernate.MappingException:表文档中的关联引用了一个未映射的类:User:org.hibernate.MappingException:表文档中的关联引用了一个未映射的类:User

但在这种情况下,我希望允许任何用户拥有文档的多态效果,同时强制系统的每个用户都适合其中一个已定义的角色.因此,用户不应该直接实例化并且是抽象的.

我不想在非抽象的User类中使用enum作为角色,因为我希望能够为不同的角色添加额外的属性,这在某些情况下可能没有意义(我不希望有单个用户,角色设置为RegularEmployee,以某种方式获取非null的managedGroup).

这是Grails中的错误吗?我错过了什么吗?

Mat*_*man 3

您可能想查看 Shiro、Nimble(使用 Shiro)和/或 Spring Security 插件的域模型。他们创建一个具体的用户域和一个具体的角色域。Shiro 特别为多对多映射创建了一个 UserRole 域。

然后在您的角色域上,您可以添加您想要的任何属性。如有必要,您可以创建一个单独的域以允许任意属性,如下所示:

class Role {
    //some properties
    static hasMany = [roleProperties:RoleProperty, ...]
}

class RoleProperty {
    String name
    String value
    static belongsTo = [role:Role]
}
Run Code Online (Sandbox Code Playgroud)

不过,我认为您不会在当前的域映射中获得所需的内容。