gpt4 book ai didi

grails - 约束错误…在生产和测试环境中的外键。开发人员运作良好。 - Cereal

转载 作者:行者123 更新时间:2023-12-02 15:52:16 25 4
gpt4 key购买 nike

我在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]
}

而且我有以下代码来加载初始数据。这对于所有三个环境都是相同的代码。开发人员工作正常,但生产和测试显示错误。
// 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)

以下是仅在测试和生产环境中显示的错误。我不知道为什么开发环境不会失败,而其他环境会因这种违反而失败。

**Error**

最佳答案

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

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

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

关于grails - 约束错误…在生产和测试环境中的外键。开发人员运作良好。 - Cereal ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37366678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com