如何防止更新casade

时间:2013-11-07 19:23:34

标签: grails gorm grails-domain-class

我正在使用grails工作,我注意到了一些我想解决的奇怪行为,但我无法弄清楚我错过了什么。 我有一个可能有建筑物的位置。每栋建筑都可以有多个套房。 此外,我有一个租户,有租户位置。租户位置更多地用于历史报告,以便我们可以查看租户是否移动了位置。 这个类看起来像这样

class Location {

    String name
    String shortName
    Country country
    LocationTypeEnum locationType = LocationTypeEnum.STUD // as default

    static hasMany = [building: Building]

    Date dateCreated
    Date lastUpdated

    static constraints = {
        name unique: true, maxSize: 30
        shortName unique: true, maxSize: 3
        country nullable: false
        locationType nullable: false
    }

    static mapping = {
        cache usage: 'nonstrict-read-write', include: 'non-lazy'
    }
}

class Building {
    String type
    String name
    Date dateCreated
    Date lastUpdated

    static belongsTo = [location: Location]
    static hasMany = [suites: Suite]

    static constraints = {
        name unique: true, maxSize: 25
        type inList: ["A", "B", "C"], nullable: true
    }

    String toString() {
        name
    }
}

class Suite {
    int suiteNumber
    Date dateCreated

    static belongsTo = [building: Building]

    static constraints = {

        pen(validator: { return it > 0 && (it.toString().length()) <= 3 })

    }

    String toString() {
        suite.toString()
    }
}

class Tenant {

    static hasMany = [tenantLocation: TenantLocation]

    ----
    Suite suite
    String comments
    Date dateCreated
    Date lastUpdated

    boolean active = true

    static constraints = {
        --------
        type
        nullable: false
        comments maxSize: 5000

    }

}

class TenantLocation {
    static belongsTo = [tenant: Tenant]
    Tenant tenant
    Suite suite
    Date dateCreated
}

因此,我们的想法是,在创建租户时创建租户位置,并且仅在当前租户套件发生更改时创建新的租户位置。

然而,我所看到的不仅是tenantLocation被保存(这是我想要的)套件也在被更新(这不是我想要的)。

例如,我有1号楼和1至20号套房,2号楼有1至25号套房。我有1号楼5号楼的租户,他们搬到2号楼23号楼。现在突然间2楼有两间套房,套房数为5。

当我只想要租户必须更换的套房时,如何让我的套房从一栋楼移动到另一栋楼?

正在进行更新的代码位于租户控制器中,如下所示:

def update() {
    def tenantInstance = Tenant.get(params.id)

    if (!tenantInstance) {
        flash.message = message(code: 'default.not.found.message', args: [
            message(code: 'tenant.label', default: 'Tenant'),
            params.id
        ])
        redirect action: "list"
        return
    }

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

    tenantInstance.properties = params

    if (!tenantInstance.save(flush: true)) {
        render view: "edit", model: [tenantInstance: tenantInstance, BuildingListInstance: Building.list()]
        return
    }


    def tenantLocation= TenantLocation.findAllByTenant(tenantInstance)
    def locationCheck = tenantLocation.last()



    //if tenant location is not null and the suite/building change create new Tenant Location entry
    if (tenantLocation!=null)
    {
        if(locationCheck.pen.id !=tenantInstance.suite.id)
        {

            def location = new TenantLocation(
                    tenant: tenantInstance,
                    suite: tenantInstance.suite,
                    dateCreated: new Date()
                    ).save(flush:true)
        }

    }



    flash.message = message(code: 'default.updated.message', args: [
        message(code: 'tenant.label', default: 'Tenant'),
        tenantInstance.id
    ])
    redirect action: "show", id: tenantInstance.id
}

0 个答案:

没有答案