【问题标题】:Update to grails domain don'tpersist对 grails 域的更新不会持续存在
【发布时间】:2015-04-05 12:57:17
【问题描述】:

我正在使用 grails 2.3.8

我们有以下领域类:

abstract class GroupItem {
  static belongsTo = [group:AppGroup]
  static mapping = {
    tablePerHierarchy = false
  }
}

class MyDomain extends GroupItem {
  String name
  String type
  int Identifier

  static hasMany = [attributes:Attribute]

  static mapping = {
    attributes cascade: 'all-delete-orphan'
  }
}

class Attribute {
  String name
  String value
  static belongsTo = [myDomain:MyDomain]
}

在我的控制器的“更新”方法中,我试图更新一个“MyDomain”对象。我可以更新与域相关联的属性,但是当我尝试更改实例本身的任何属性(名称、标识符或类型)时,更改不会持续存在。控制器代码:

def update(Long id) {
  --- 
  def myDomain = MyDomain.get(id)
  myDomain.type = 'DIFFERENT TYPE'
  myDomain.save(flush:true, failOnError:true)
}

但是,数据库中的信号仍然具有与创建时相同的类型。为了尝试遵循逻辑,我向打印出类型的域类添加了一个 beforeUpdate 方法,我可以看到它正在被调用,并且在 beforeUpdate 中它认为该类型是我的新值,但是更新永远不会持久。没有异常,对象验证,并且任何日志中都没有任何内容。任何线索可能导致这种情况?

干杯!

【问题讨论】:

  • 一些错误?如果不是,请尝试 beforeInsert() 而不是 beforeUpdate()
  • 不,没有错误。刚刚尝试检查,似乎认为该对象不脏。

标签: grails grails-orm grails-domain-class


【解决方案1】:

对……打脸

我在那篇文章中没有包含的内容是它们的更新实际上是在服务中发生的(使用 @Transactional 注释,并且我还使用命令对象在控制器的早期进行一些验证。命令对象通过查看

是否返回非 null 来检查组 id 是否有效
def group = AppGroup.read(id).

我不知道为什么,但似乎因为这个对象在会话中,所以它是在事务结束时被保存的对象,它并不脏。如果我在完成后丢弃该组,那么一切正常。

不知道为什么会这样,但是嘿嘿,解决了我的问题。可能会尝试看看 exists() 是否更合适...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多