0

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

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

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。

4

2 回答 2

2

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

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

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

因此,您无需扩展/弯曲 SubscriptionController 或 UserController(或 UserController 和 EmployeeController,根据您的示例),而是创建处理 SignUpCommand 对象的 SignUpController。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()
}

这主要是品味和风格的问题。

于 2012-07-21T04:32:05.447 回答
1

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

class UserController {

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

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

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

在此服务方法中,您将提取要保存在不同表中的数据(用户或参数,无论您的船是什么),只要是通常的用户对象。

于 2012-07-19T17:23:06.167 回答