use*_*858 6 grails save grails-orm domain-model
我目前正在开发Grails应用程序,我正在使用Spring Security和UI插件.我创建了User Class和我所拥有的另一个Area Class之间的关系,如下所示:
用户类:
class User {
transient springSecurityService
String username
String email
String password
boolean enabled
boolean accountExpired
boolean accountLocked
boolean passwordExpired
static belongsTo = [area:Areas]
.......
}
Run Code Online (Sandbox Code Playgroud)
地区分类:
class Areas {
String name
static hasMany = [users:User]
}
Run Code Online (Sandbox Code Playgroud)
从类中可以看出,一个用户可以链接到一个区域,但一个区域可能有很多用户.这一切都很好,当我引导应用程序时,所有数据都正确添加.但是,当我尝试使用表单来创建新用户时,我收到以下错误:
object references an unsaved transient instance - save the transient instance before flushing: com.website.Area
Run Code Online (Sandbox Code Playgroud)
下面是我用来保存信息的控制器代码:
def save = {
def user = lookupUserClass().newInstance(params)
if (params.password) {
String salt = saltSource instanceof NullSaltSource ? null : params.username
user.password = springSecurityUiService.encodePassword(params.password, salt)
}
if (!user.save(flush: true)) {
render view: 'create', model: [user: user, authorityList: sortedRoles()]
return
}
addRoles(user)
flash.message = "${message(code: 'default.created.message', args: [message(code: 'user.label', default: 'User'), user.id])}"
redirect action: edit, id: user.id
}
Run Code Online (Sandbox Code Playgroud)
以下是GSP的样子:
<table>
<tbody>
<s2ui:textFieldRow name='username' labelCode='user.username.label' bean="${user}"
labelCodeDefault='Username' value="${user?.username}"/>
<s2ui:passwordFieldRow name='password' labelCode='user.password.label' bean="${user}"
labelCodeDefault='Password' value="${user?.password}"/>
<s2ui:textFieldRow name='email' labelCode='user.email.label' bean="${user}"
labelCodeDefault='E-Mail' value="${user?.email}"/>
<s2ui:textFieldRow readonly='yes' name='area.name' labelCode='user.area.label' bean="${user}"
labelCodeDefault='Department' value="${area.name}"/>
<s2ui:checkboxRow name='enabled' labelCode='user.enabled.label' bean="${user}"
labelCodeDefault='Enabled' value="${user?.enabled}"/>
<s2ui:checkboxRow name='accountExpired' labelCode='user.accountExpired.label' bean="${user}"
labelCodeDefault='Account Expired' value="${user?.accountExpired}"/>
<s2ui:checkboxRow name='accountLocked' labelCode='user.accountLocked.label' bean="${user}"
labelCodeDefault='Account Locked' value="${user?.accountLocked}"/>
<s2ui:checkboxRow name='passwordExpired' labelCode='user.passwordExpired.label' bean="${user}"
labelCodeDefault='Password Expired' value="${user?.passwordExpired}"/>
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)
我已经研究了这个,我相信这是我试图保存GORM对象的方式,我应该在尝试保存用户之前保存父(Area).但是,在创建用户之前区域将始终存在,因此我不需要再次创建区域,我该如何处理?我尝试了"withTransaction"功能也没有成功
如果可能的话,我真的很感激一些帮助.
谢谢
编辑......
我已在Controller中跟踪此行的问题:
RegistrationCode registrationCode = springSecurityUiService.register(user, command.password, salt)
Run Code Online (Sandbox Code Playgroud)
这告诉我这个函数正在为用户对象调用一个save函数,但是如果有关系,它需要首先保存Area.有谁知道SpringSecurityUi以帮助我吗?
谢谢
您看到的错误消息
object references an unsaved transient instance - save the transient instance before flushing: com.website.Area
Run Code Online (Sandbox Code Playgroud)
...当您尝试从子(即用户)实体保存不存在的父(即Area)实体时发生.正如您所指出的那样,您可能会在RegistrationController.register方法中发生错误,如果您正在保存新用户的位置.
RegistrationCode registrationCode = springSecurityUiService.register(user, command.password, salt)
Run Code Online (Sandbox Code Playgroud)
您只需要使用逻辑更新RegistrationCode.register方法,以便在注册调用之前将区域分配给用户(假设区域已经存在)- 下面是一个快速示例.
class RegistrationController ..
..
def area = Area.findByName(command.areaName)
def user = lookupUserClass().newInstance(email: command.email, username: command.username,
accountLocked: true, enabled: true, area: area)
RegistrationCode registrationCode = springSecurityUiService.register(user, command.password, salt)
Run Code Online (Sandbox Code Playgroud)
几个笔记:
无论如何,希望有所帮助.
| 归档时间: |
|
| 查看次数: |
7200 次 |
| 最近记录: |