Mysql 在grails中保存2个类的值

Mysql 在grails中保存2个类的值,mysql,grails,groovy,Mysql,Grails,Groovy,我有两个名为User.groovy和Employee.groovy的类,我使用MYSQL保存数据。我想要的是创建一个新的用户帐户并将其保存到用户表中,同时将一些数据保存到Employee表中。我该怎么做?我尝试将用户扩展到雇员,但数据只保存到用户,而不保存到雇员。但是如果我不扩展用户,数据只保存到Employee。我应该怎样做才能使数据同时保存到两个数据库表中?请帮帮我 实际上,在我的类中有这样的用户: class User { transient springSecurityService

我有两个名为User.groovy和Employee.groovy的类,我使用MYSQL保存数据。我想要的是创建一个新的用户帐户并将其保存到用户表中,同时将一些数据保存到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。

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

class UserController {

/*Injection of your service in the controller class*/
def userService
然后在同一控制器的保存操作中:

userService.save(user) // userService.save(params)
在这个服务方法中,您将提取您想要保存在不同表中的数据(用户或参数,无论您的船漂浮在什么地方),只要是普通的用户对象。

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

class UserController {

/*Injection of your service in the controller class*/
def userService
然后在同一控制器的保存操作中:

userService.save(user) // userService.save(params)
在这个服务方法中,您将提取您想要保存在不同表中的数据(用户或参数,任何漂浮在船上的数据),只要是普通的用户对象。

Grails范例(就脚手架而言)是一个表单-一个对象。只要你坚持这个范例,你就可以得到所有的好处,比如输入验证和免费的错误报告(你也可以考虑使用字段插件)。 但是,有时您需要收集信息并通过单个表单创建两个或多个对象。通常,当您需要启动新订阅并收集订阅详细信息(例如,订阅实体)和用户信息(用户实体)的信息时,会发生这种情况。这就是指挥对象来营救的地方

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

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

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()
}
这主要是口味和风格的问题

Grails范式(就脚手架而言)是一种形式一个对象。只要你坚持这个范例,你就可以得到所有的好处,比如输入验证和免费的错误报告(你也可以考虑使用字段插件)。 但是,有时您需要收集信息并通过单个表单创建两个或多个对象。通常,当您需要启动新订阅并收集订阅详细信息(例如,订阅实体)和用户信息(用户实体)的信息时,会发生这种情况。这就是指挥对象来营救的地方

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

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

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()
}

这主要是口味和风格的问题

你明白我在回答中提到的吗?你明白我在回答中提到的吗?