Grails-保存多个对象,如果一个对象未能保存,则回滚所有对象
我需要一次保存多个对象,如果一个对象未能保存,则回滚所有对象。 例如:Grails-保存多个对象,如果一个对象未能保存,则回滚所有对象,grails,transactions,gorm,Grails,Transactions,Gorm,我需要一次保存多个对象,如果一个对象未能保存,则回滚所有对象。 例如: class Transaction { Item item; } class Item { date lastTransaction; } 如果创建新事务,则需要更改lastTransaction值并保存该项。 如果保存项目失败,则需要回滚事务(反之亦然) 有什么想法吗?创建一个服务方法,并将您的持久性逻辑放在其中。调用save时,如果指定failOnError:true,则如果存在验证问题,将抛出异常并回滚事
class Transaction {
Item item;
}
class Item {
date lastTransaction;
}
如果创建新事务,则需要更改lastTransaction值并保存该项。
如果保存项目失败,则需要回滚事务(反之亦然)
有什么想法吗?创建一个服务方法,并将您的持久性逻辑放在其中。调用
save
时,如果指定failOnError:true
,则如果存在验证问题,将抛出异常并回滚事务
def myServiceMethod(...some parameters...) {
....
Item item = new Item(lastTransaction: new Date())
item.save(failOnError: true)
Transaction transaction = new Transaction(item: item)
transaction.save(failOnError: true)
...
return transaction
}
另外,通读一下Grails文档的内容。创建一个服务方法,并将持久性逻辑放在其中。调用
save
时,如果指定failOnError:true
,则如果存在验证问题,将抛出异常并回滚事务
def myServiceMethod(...some parameters...) {
....
Item item = new Item(lastTransaction: new Date())
item.save(failOnError: true)
Transaction transaction = new Transaction(item: item)
transaction.save(failOnError: true)
...
return transaction
}
另外,通读一下Grails文档的内容。真恶心。不要抛出异常以回滚事务。如果事务管理器假定运行时异常意味着您无法控制事务,则会自动回滚事务以防止您造成更大的损害,那么利用的副作用将产生相当高的成本。这有点像孤独,用锤子反复敲打自己的脑袋,所以一些急诊医生,也许护士或医生会花一些时间陪你 回滚事务非常容易,但不幸的是Grails没有公开以下任何内容:
import org.springframework.transaction.interceptor.TransactionAspectSupport
class FooService {
def someMethod(...) {
boolean somethingBadHappened = ...
if (somethingBadHappened) {
// roll back
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
}
// ok, proceed
...
}
}
稍后,您可以检查当前事务是否使用
TransactionAspectSupport.currentTransactionStatus().isRollbackOnly()
请注意,这在控制器中不起作用,因为事务将在该点结束。糟糕。不要抛出异常以回滚事务。如果事务管理器假定运行时异常意味着您无法控制事务,则会自动回滚事务以防止您造成更大的损害,那么利用的副作用将产生相当高的成本。这有点像孤独,用锤子反复敲打自己的脑袋,所以一些急诊医生,也许护士或医生会花一些时间陪你 回滚事务非常容易,但不幸的是Grails没有公开以下任何内容:
import org.springframework.transaction.interceptor.TransactionAspectSupport
class FooService {
def someMethod(...) {
boolean somethingBadHappened = ...
if (somethingBadHappened) {
// roll back
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
}
// ok, proceed
...
}
}
稍后,您可以检查当前事务是否使用
TransactionAspectSupport.currentTransactionStatus().isRollbackOnly()
请注意,这在控制器中不起作用,因为事务将在该点结束。要回滚事务,您需要抛出RuntimeException您可能希望为域对象使用不同的名称(
BankTransaction
或其他适当的名称),否则,您说的是希望更新事务中的事务
,但回滚事务如果事务
更新失败,您的头会爆炸:-)要回滚事务,您需要抛出RuntimeException您可能希望为域对象使用不同的名称(BankTransaction
或其他合适的东西),否则您说的是想更新交易中的交易
,但如果交易
无法更新,您的头会爆炸,则回滚交易:-)您好,谢谢您的回答。我的问题解决了:-)你好,谢谢你的回答。我的问题解决了:-)是的,这也是可行的。但我需要抓取FieldError或ValidationException以显示在.gsp页面中。因此,即使我使用这个,我仍然需要抛出新的异常。您可以返回未能保存的对象并调用hasrerrors()
,getErrors()
,等等。异常是100%不必要的。下面是一个很好的资源,它显示了异常是多么昂贵:-想象一下,如果他们看到Groovy异常,它们的堆栈帧比普通Java异常多得多。我相信你是对的。我会改变我的代码,即使它看起来有点脏,没有例外:-)谢谢提示Burt-如果抛出异常回滚事务被认为是不好的做法,我认为应该更新文档,说()是的,这也是可行的。但我需要抓取FieldError或ValidationException以显示在.gsp页面中。因此,即使我使用这个,我仍然需要抛出新的异常。您可以返回未能保存的对象并调用hasrerrors()
,getErrors()
,等等。异常是100%不必要的。下面是一个很好的资源,它显示了异常是多么昂贵:-想象一下,如果他们看到Groovy异常,它们的堆栈帧比普通Java异常多得多。我相信你是对的。我会改变我的代码,即使它看起来有点脏,没有例外:-)谢谢提示Burt-如果抛出异常回滚事务被认为是不好的做法,我认为应该更新文档说()