0

我有一个域类用户定义为

class User extends SecUser{
    String fullName
    String address
    String city
    String country
    String role
    String email
    String schoolName
    String gradeLevel

    static constraints = {
        fullName(nullable:true)
        username(blank:false, unique:true)
        password(size:6..20, blank:false)
        //passwordRepeat(validator:)
        email(email:true, nullable:true, unique:true)
        address(nullable:true)
        city(nullable:true)
        country(nullable:true)
        phone(nullable:true) //10 digit phone number, no spaces
        role(blank:false, inList:['Teacher', 'Donor', 'Both'])
        schoolName(nullable:true)
        gradeLevel(nullable:true, inList:['K', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', 'College'])

    }
}

SecUser 是通过执行 spring security grails 插件的 quickstart 脚本实现的一个类。其定义为

class SecUser {

    transient springSecurityService

    String username
    String password
    boolean enabled
    boolean accountExpired
    boolean accountLocked
    boolean passwordExpired

    static constraints = {
        username blank: false, unique: true
            password blank: false
    }
}

通常,我认为生成的数据库表将是一个 USER 表,上面列出的字段作为列,我可以使用 UserController 方法来实现 CRUD。问题是,永远不会创建用户表,而是使用上述字段实例化 SEC_USER 表。

我的问题与创建新用户和填充相关字段有关。由于 USER 表不存在,我无法从 User 域对象插入记录。

另一方面,我可以在 SEC_USER 表中插入记录,但字段仅限于 SecUser 域类中定义的字段。如果我确实尝试通过新的 SecUser 实例在 User 的特定列中插入一个项目,我会收到一个 property not defined 错误消息。

这有点令人沮丧,因为为了完成用户注册过程,我需要访问、插入和更新相关字段,但是如何在没有访问权限的情况下做到这一点?

4

1 回答 1

1

我相信您正在寻找的是每个子类映射的表,而不是每个层次结构的默认表。

默认的 table-per-hierarchy 会使处理数据库变得困难 其他缺点是列不能在 db 级别应用“Not Null”约束。

grails 在 5.5.2.3 Inheritance Strategies 中有一些关于此的文章。

如果您将以下内容添加到您的域类中,您将获得每个子类的表

 static mapping = {
    tablePerHierarchy false
 }
于 2012-04-19T13:53:39.817 回答