约束错误... Prod和测试环境中的外键。开发效果很好。 - Grails

时间:2016-05-21 18:34:07

标签: grails gorm grails-plugin grails-2.0 grails-domain-class

我在Grails 2.5.3中有一个系统,我在测试和生产环境中遇到了 Bootstrap 文件的问题。在 DEV环境中,初始数据加载工作正常。

使用的域类。 SecUser - Spring安全

class SecUser implements Serializable {

    ...
    UUID id
    Date dateCreated
    String username
    String password
    String email
    ....
}

普通用户。 用户

class User extends SecUser {

    UUID id
    String name
    ...

    // Relations
    static belongsTo = [department:Department]
    static hasMany = [evaluations:Evaluation]
}

评价

class Evaluation {

    UUID id
    Integer attemptNumber
    Date completenessDate
    Integer maxAttempt
    String testName
    Float testScore

    // Relations
    static belongsTo = [user:User]
}

我有以下代码来加载初始数据。对于所有三种环境,它都是相同的代码。 Dev工作得很好,但prod和test显示错误。

// Role
def adminRole = new SecRole(authority: 'ROLE_ADMIN')
def userRole = new SecRole(authority: 'ROLE_USER')

// Administrator
def newAdmin = new SecUser( 
     username: 'admin',
     password: 'admin',
     email: 'admin@example.com')

// Department
def idDepartment = new Department(name: 'I+D')

// Normal user
def newUser = new User(
     username: 'user',
     password: 'user',
     email: 'user@example.com',
     name: 'userTest',
     department: idDepartment
 )

// Evaluation
def evalUser = new Evaluation(
     testName: 'Test example',
     attemptNumber: 1,
     maxAttempt: 2,
     completenessDate: new Date(),
     testScore: 7.55,
     user: newUser)

// Saving roles
adminRole.save(flush: true, failOnError: true)
userRole.save(flush: true, failOnError: true)

// Saving new admin
newAdmin.save(flush: true, failOnError: true)

// Saving departments
idDepartment.save(flush: true, failOnError: true)

// Saving new users
newUser.save(flush: true, failOnError: true)

// Assign user to role
if (!newAdmin.authorities.contains(adminRole)) {
    SecUserSecRole.create newAdmin, adminRole, true
}
if (!newUser.authorities.contains(userRole)) {
    SecUserSecRole.create newUser, userRole, true
}

// Saving evaluations - HERE IS THE ERROR
evalUserSTT1.save(flush: true, failOnError: true)

仅在测试和prod环境中显示的错误如下。我不知道为什么开发环境不会失败,其他环境因此违规而失败。

**Error**

1 个答案:

答案 0 :(得分:0)

这是因为在开发环境中,数据源配置设置为dbCreate =“create-drop”,这意味着每次重新启动应用程序时,它都会丢弃,然后重新创建数据库。但是,在测试和生产环境中,将设置为dbCreate =“update”,它仅更新新更改。现在基于您的引导代码,您不会在保存之前检查对象是否存在,因此引导代码将尝试创建相同的角色和第一次运行时已存在的用户,这会导致冲突。

总之,修改引导代码以检查记录是否已存在,这只是一个示例,但必须对其他角色和用户等执行相同操作,例如:

def adminRole
def adminRoleExists = SecRole.findByAuthority('ROLE_ADMIN')
if(!adminRoleExists ) {
    adminRole = new SecRole(authority: 'ROLE_ADMIN')
    adminRole.save(flush: true, failOnError: true)
}