保存grails中2个类的值

时间:2012-07-19 16:41:26

标签: mysql grails groovy

我有2个名为User.groovy和Employee.groovy的类,我使用MYSQL来保存数据。我想要的是创建一个新的用户帐户并将其保存到User表,并将一些数据保存到Employee表。我怎样才能做到这一点?我已经尝试将用户扩展到Employee,但数据只保存到User而不是Employee。但是如果我不扩展用户,则数据仅保存到Employee。我该怎么做才能将数据同时保存到两个数据库表中?请帮我。

实际上我的班级用户有这个:

class User {

transient springSecurityService

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

和员工:

class Employee {

String name
String email
String jobDesc
....}

那我接下来该怎么办?对不起,我还在开始学习grails。

2 个答案:

答案 0 :(得分:2)

Grails范例(就脚手架而言)是一种形式 - 一个对象。只要您坚持这种范式,您就可以免费获得所有好处,例如输入验证和错误报告(您也可以考虑使用此处的字段插件http://grails.org/plugin/fields)。

但是,有时您需要收集信息并通过单一表单创建两个或更多对象。通常,当您需要发起新订阅并收集订阅详细信息(例如,订阅实体)和用户信息(用户实体)的信息时,就会发生这种情况。这是命令对象拯救的地方。

http://grails.org/doc/latest/guide/theWebLayer.html#commandObjects

因此,您可以创建处理SignUpCommand对象的SignUpController,而不是扩展/弯曲SubscriptionController或UserController(或UserController和EmployeeController,根据您的示例)。 SignUpCommand对象不打算保存,它用作SignUpController.create表单的后备对象。验证时,使用signUpCommand对象数据初始化2个域对象(即订阅和用户),并在同一事务中单独保存这些对象

您可以将保存操作委托给服务,例如

if (signUpCmd.validate()) {
    SignUpService.save(signUpCmd))
}

或在控制器

内的现场创建并保存两个对象
if (signUpCmd.validate()) {
    Subscription subscription = new Subscription(plan: signUpCmd.plan, ...)
    subscription.save()
    User user = new User(username: signUpCmd.username, ...)
    user.save()
}

主要是品味和风格。

答案 1 :(得分:1)

不是直接将save()调用到您的用户实例,而是调用一个服务类,该服务类在一次原子操作中保存用户和员工。比如,例如:

class UserController {

/*Injection of your service in the controller class*/
def userService

然后在同一控制器的保存操作中:

userService.save(user) // userService.save(params)

在这个服务方法中,只要是普通的用户对象,你就可以提取你想要保存在不同表中的数据(用户或参数,无论你的船是什么)。