Grails clear有多个条目并添加新条目错误?

Grails clear有多个条目并添加新条目错误?,grails,gorm,Grails,Gorm,我目前正在开发一个grails应用程序,我有一个附加到帐户的地址列表。基本上,我想做的是当帐户被编辑时,显示所有附加地址的当前列表,然后我可以从视图中删除/添加任意数量的地址。当捕获此数据时,控制器会拾取该数据,我要做的是能够清除此帐户中的所有当前地址,然后使用视图中存在的内容再次创建列表,我的代码如下: 帐户域: class Account { String name Date dateCreated Date lastUpdated static hasM

我目前正在开发一个grails应用程序,我有一个附加到帐户的地址列表。基本上,我想做的是当帐户被编辑时,显示所有附加地址的当前列表,然后我可以从视图中删除/添加任意数量的地址。当捕获此数据时,控制器会拾取该数据,我要做的是能够清除此帐户中的所有当前地址,然后使用视图中存在的内容再次创建列表,我的代码如下:

帐户域:

class Account {

    String name
    Date dateCreated
    Date lastUpdated

    static hasMany = [addresses:Addresses]

    static mapping = {
        addresses cascade:"all-delete-orphan"
    }

    def getAddressesList() {
        return LazyList.decorate(
              addresses,
              FactoryUtils.instantiateFactory(Addresses.class))
    }

    static constraints = {
        name(blank:false, unique: true)
    }

}
class Addresses {

    int indexVal
    String firstLine
    String postcode
    String area

    static belongsTo = [account:Account]

    static mapping = {
    }

    static transients = [ 'deleted' ]

    static constraints = {
        indexVal(blank:false, min:0)
    }


}
def update() {

    def accountInstance = Account.get(params.id)
    if (!accountInstance) {
        flash.message = message(code: 'default.not.found.message', args: [message(code: 'account.label', default: 'Account'), params.id])
        redirect(action: "list")
        return
    }

    if (params.version) {
        def version = params.version.toLong()
        if (accountInstance.version > version) {
            accountInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
                      [message(code: 'subscriptions.label', default: 'Subscriptions')] as Object[],
                      "Another user has updated this Account while you were editing")
            render(view: "edit", model: [accountInstance: accountInstance])
            return
        }
    }

    accountInstance.properties = params

    accountInstance.addresses.clear()
    accountInstance.save(flush: true)

    ....

}
地址域:

class Account {

    String name
    Date dateCreated
    Date lastUpdated

    static hasMany = [addresses:Addresses]

    static mapping = {
        addresses cascade:"all-delete-orphan"
    }

    def getAddressesList() {
        return LazyList.decorate(
              addresses,
              FactoryUtils.instantiateFactory(Addresses.class))
    }

    static constraints = {
        name(blank:false, unique: true)
    }

}
class Addresses {

    int indexVal
    String firstLine
    String postcode
    String area

    static belongsTo = [account:Account]

    static mapping = {
    }

    static transients = [ 'deleted' ]

    static constraints = {
        indexVal(blank:false, min:0)
    }


}
def update() {

    def accountInstance = Account.get(params.id)
    if (!accountInstance) {
        flash.message = message(code: 'default.not.found.message', args: [message(code: 'account.label', default: 'Account'), params.id])
        redirect(action: "list")
        return
    }

    if (params.version) {
        def version = params.version.toLong()
        if (accountInstance.version > version) {
            accountInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
                      [message(code: 'subscriptions.label', default: 'Subscriptions')] as Object[],
                      "Another user has updated this Account while you were editing")
            render(view: "edit", model: [accountInstance: accountInstance])
            return
        }
    }

    accountInstance.properties = params

    accountInstance.addresses.clear()
    accountInstance.save(flush: true)

    ....

}
客户控制员:

class Account {

    String name
    Date dateCreated
    Date lastUpdated

    static hasMany = [addresses:Addresses]

    static mapping = {
        addresses cascade:"all-delete-orphan"
    }

    def getAddressesList() {
        return LazyList.decorate(
              addresses,
              FactoryUtils.instantiateFactory(Addresses.class))
    }

    static constraints = {
        name(blank:false, unique: true)
    }

}
class Addresses {

    int indexVal
    String firstLine
    String postcode
    String area

    static belongsTo = [account:Account]

    static mapping = {
    }

    static transients = [ 'deleted' ]

    static constraints = {
        indexVal(blank:false, min:0)
    }


}
def update() {

    def accountInstance = Account.get(params.id)
    if (!accountInstance) {
        flash.message = message(code: 'default.not.found.message', args: [message(code: 'account.label', default: 'Account'), params.id])
        redirect(action: "list")
        return
    }

    if (params.version) {
        def version = params.version.toLong()
        if (accountInstance.version > version) {
            accountInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
                      [message(code: 'subscriptions.label', default: 'Subscriptions')] as Object[],
                      "Another user has updated this Account while you were editing")
            render(view: "edit", model: [accountInstance: accountInstance])
            return
        }
    }

    accountInstance.properties = params

    accountInstance.addresses.clear()
    accountInstance.save(flush: true)

    ....

}
错误:

class Account {

    String name
    Date dateCreated
    Date lastUpdated

    static hasMany = [addresses:Addresses]

    static mapping = {
        addresses cascade:"all-delete-orphan"
    }

    def getAddressesList() {
        return LazyList.decorate(
              addresses,
              FactoryUtils.instantiateFactory(Addresses.class))
    }

    static constraints = {
        name(blank:false, unique: true)
    }

}
class Addresses {

    int indexVal
    String firstLine
    String postcode
    String area

    static belongsTo = [account:Account]

    static mapping = {
    }

    static transients = [ 'deleted' ]

    static constraints = {
        indexVal(blank:false, min:0)
    }


}
def update() {

    def accountInstance = Account.get(params.id)
    if (!accountInstance) {
        flash.message = message(code: 'default.not.found.message', args: [message(code: 'account.label', default: 'Account'), params.id])
        redirect(action: "list")
        return
    }

    if (params.version) {
        def version = params.version.toLong()
        if (accountInstance.version > version) {
            accountInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
                      [message(code: 'subscriptions.label', default: 'Subscriptions')] as Object[],
                      "Another user has updated this Account while you were editing")
            render(view: "edit", model: [accountInstance: accountInstance])
            return
        }
    }

    accountInstance.properties = params

    accountInstance.addresses.clear()
    accountInstance.save(flush: true)

    ....

}
拥有实体实例com.tool.Account.addresses不再引用cascade=“all delete orphan”的集合。堆栈跟踪如下:
消息:拥有实体实例com.tool.Account.addresses不再引用cascade=“all delete orphan”的集合

此错误似乎发生在控制器联机中:

accountInstance.save(flush: true)

我已经尝试了几种不同的方法来实现这一点,非常感谢您的帮助

看来您已经完成了Grails可以为您做的一些工作

class Account {

    String name
    Date dateCreated
    Date lastUpdated

    List addresses

    static hasMany = [addresses:Address]

    static mapping = {
        addresses cascade:"all-delete-orphan"
    }

    static constraints = {
        name(blank:false, unique: true)
    }

}

class Address {
    String firstLine
    String postcode
    String area

    static belongsTo = [account:Account]
}
这将产生您想要的将地址作为列表的效果

我也找到了

instance.addresses = null


帐户
类中定义
地址级联时为我工作您不需要
静态归属到=[Account:Account]
地址
中的
静态归属。所以,只要试着删除该语句并测试代码即可。请参阅相关。

不应将
clear()
放在
params
设置为
properties
之前?交换这两行。我试过了,但仍然得到相同的错误:如果我从帐户域中删除行(地址级联:“全部删除孤立项”),然后让控制器清除地址并添加新的地址,我没有收到错误,但它只是将它们添加到已经存在的列表中,创建一些重复项,有什么想法吗?belongsTo和cascade策略互不相关。当您想在删除帐户时删除地址时使用此策略。但是这个问题要求在不删除帐户的情况下清除地址列表