我有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。
答案 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)
在这个服务方法中,只要是普通的用户对象,你就可以提取你想要保存在不同表中的数据(用户或参数,无论你的船是什么)。