我有一个看起来如下的命令对象......
@Validateable
class ACommand implements Serializable
{
ADomainObject bundleDef
}
我使用表单填充Command然后使用类似于此
的控制器def save(ACommand command)
我还在Config.groovy
中添加了以下内容grails.gorm.autoFlush = false
问题是即使我没有刷新(甚至调用.save())它仍然会在返回时保存到数据库中。有没有人经历过这个?有办法吗?
更新
还尝试了以下
def save(ACommand command)
{
try{
service.saveADomainObject(command.adomain) //save called in here if no error
}
catch(Exception e3){
log.error(e3);
command.adomain.discard()
}
// renders ...
}
这也不起作用,即使调用了丢弃(我设置了一个断点),它仍然可以保存。
更新2
我改变了我的服务,如下所示
adomain.discard()
throw new InvalidObjectException("Blah Blah Blah")
似乎在抛出错误后直接保存到DB。我还确认我的服务是交易性的。
更新3
添加我的服务类以供参考
@Transactional(readOnly = true)
def saveADomainObject(def adomain, def test) throws InvalidParameterException, InvalidObjectException, Exception{
if (!test)
{
throw new InvalidParameterException("*")
}
else
{
if (adomain?.id)
{
if (!isValidBundleName(adomain, test))
{
//TODO: Make default.cannot.save.message
throw new InvalidObjectException("*")
}
errors = updateDomain(adomain)
}
else
{
errors = createNewdomain(adomain)
}
if (errors)
{
throw new Exception(errors)
}
}
}
protected def updateDomain(def adomain)
{
adomain.updatedBy = user
String errors=null;
if (adomain.getErrors().allErrors.size() > 0)
{
errors = adomain.getErrors().allErrors.join("\n")
}
return errors
}
private def createNewdomain(def adomain)
{
adomain.createdBy = user
String errors = null
if (adomain.getErrors().allErrors.size() > 0)
{
errors = adomain.getErrors().allErrors.join("\n")
}
return errors
}
答案 0 :(得分:1)
如果ADomainObject bundleDef
绑定到已经持久的对象(即,如果绑定此对象从数据库加载记录),则在Hibernate会话关闭时,对该对象的更改将自动保存到数据库中
如果约束无效,假设您不想保存对象,请执行以下操作:
def save(ACommand command) {
if (!command.adomain.save()) {
log.error "Failed to save domain due to errors $command.adomin.errors"
// other error handling - maybe show a form that allows the user to correct the errors
} else {
// object saved successfully, redirect to homepage, throw a party, or whatever
}
}
答案 1 :(得分:0)
这就是我设法让它发挥作用的方式......
我首先在服务中根据此qoute
添加了@Transactional(readOnly = true)
注释
此版本默认为所有读写事务的方法(由于类级别注释),但listBooks方法会覆盖此方法以使用只读事务:
这有所帮助,但现在它不会节省时间。所以我把.save()调出来让我的控制器看起来像这样......
def save(ACommand command)
{
try{
service.saveADomainObject(command.adomain) //save called in here if no error
command.adomain(flush:true)
}
catch(Exception e3){
log.error(e3);
}
// renders ...
}
我需要刷新:尽管读取了autoFlush,但我不确定是否存在。