Grails 3.2.10、Gorm 6.1.4、Hibernate 5.2.9
我有一个grails域对象和一个相应的控制器,它执行基本的crud操作(它没有脚手架)。当将Command对象提交给控制器的update方法时,控制器会按预期执行(所有日志消息都会按预期打印),并且不会抛出任何错误。重定向页面的显示方式与您预期的一样,并显示flash消息(即使包含更新的数据)。但是,数据库值不会实际更新。我可以创建对象,它只在更新时这样做。
发布于 2017-06-23 22:43:16
在经历了许多挫折之后,最新的Gorm或Hibernate似乎正在监视域对象上的setXXX方法,如果这些方法没有被调用,hibernate将不会看到对象被修改,也不会更新任何更改。调高日志级别可以帮助我看到hibernate没有看到对象被修改,因此忽略了它。
我的问题集中在在调用this.xxx = CommandObject.xxx;的域对象中使用setData(CommandObject)方法,从而绕过生成的setter,导致hibernate认为对象没有被修改。
直接从控制器调用setter是解决此问题的一种方法。
示例(不起作用):
class Person {
String name
//...typical constraints, methods, etc...
void setData(PersonCommand c){
this.name = c.name;
}
}
class PersonController {
//...typical list, show, create methods...
def update(PersonCommand pc){
//... validation ...
Person p = Person.get(pc.personId);
p.setData(pc);
p.save(failOnError: true);
flash.message = "Successfully saved person ${p.name}"
redirect(action: 'show', id: p.id)
}
}修复的示例(确实有效):
class Person {
String name
//...typical constraints, methods, etc...
}
class PersonController {
//...typical list, show, create methods...
def update(PersonCommand pc){
//... validation ...
Person p = Person.get(pc.personId);
p.name = pc.name;
//... set other fields ...
p.save(failOnError: true);
flash.message = "Successfully saved person ${p.name}"
redirect(action: 'show', id: p.id)
}
}发布于 2017-06-24 00:06:01
这是一个广为人知的领域类。您必须在其他域类的方法中显式调用setter或getter:
class Person {
String name
void setData(PersonCommand c){
setName c.name
}
}另外,我会像applyData()一样将setData()重命名为smth,以避免与POGOs方法发生冲突
https://stackoverflow.com/questions/44724206
复制相似问题