组合主键的使用(1)

Grails中定义域类后,就可以通过脚手架自动生成各种CRUD操作代码。但是,如果是组合主键所生成的代码中诸多功能是不工作的,包括:

index中点击热点,自动调用show,显示当前记录;

edit功能,

delete功能。。

等等。

 

之所以不能工作,原因就是使用了复合主键——原来的ID不起作用了,或者说没有了。

 

所以,必须对域类、控制器、GSP文件都进行相应的修改,才行。

 

首先是域类的说明:

package cn.edu.cup.unit

import grails.gorm.DetachedCriteria
import groovy.transform.ToString
import org.apache.commons.lang.builder.HashCodeBuilder

@ToString(cache=true, includeNames=true, includePackage=false)
class QuantityStandardUnit implements Serializable {

    private static final long serialVersionUID = 1

    PhysicalQuantity physicalQuantity
    QuantityUnit quantityUnit

    QuantityStandardUnit(PhysicalQuantity p, QuantityUnit q) {
        this()
        physicalQuantity = p
        quantityUnit = q
    }

    @Override
    boolean equals(other) {
        if (!(other instanceof QuantityStandardUnit)) {
            return false
        }

        other.physicalQuantity?.id == 
        physicalQuantity?.id && 
        other.quantityUnit?.id == quantityUnit?.id
    }

    @Override
    int hashCode() {
        def builder = new HashCodeBuilder()
        if (physicalQuantity) builder.append(physicalQuantity.id)
        if (quantityUnit) builder.append(quantityUnit.id)
        builder.toHashCode()
    }

    static QuantityStandardUnit get(long physicalQuantityId, long quantityUnitId) {
        criteriaFor(physicalQuantityId, quantityUnitId).get()
    }

    static boolean exists(long physicalQuantityId, long quantityUnitId) {
        criteriaFor(physicalQuantityId, quantityUnitId).count()
    }

    private static DetachedCriteria criteriaFor(long physicalQuantityId, long quantityUnitId) {
        QuantityStandardUnit.where {
            physicalQuantity == PhysicalQuantity.load(physicalQuantityId) &&
            quantityUnit == QuantityUnit.load(quantityUnitId)
        }
    }

    static QuantityStandardUnit create(PhysicalQuantity physicalQuantity, QuantityUnit quantityUnit, boolean flush = false) {
        def instance = new QuantityStandardUnit(physicalQuantity, quantityUnit)
        instance.save(flush: flush, insert: true)
        instance
    }

    static boolean remove(PhysicalQuantity u, QuantityUnit r, boolean flush = false) {
        if (u == null || r == null) return false

        int rowCount = QuantityStandardUnit.where { physicalQuantity == u && quantityUnit == r }.deleteAll()

        if (flush) { QuantityStandardUnit.withSession { it.flush() } }

        rowCount
    }

    static void removeAll(PhysicalQuantity u, boolean flush = false) {
        if (u == null) return

        QuantityStandardUnit.where { physicalQuantity == u }.deleteAll()

        if (flush) { QuantityStandardUnit.withSession { it.flush() } }
    }

    static void removeAll(QuantityUnit r, boolean flush = false) {
        if (r == null) return

        QuantityStandardUnit.where { quantityUnit == r }.deleteAll()

        if (flush) { QuantityStandardUnit.withSession { it.flush() } }
    }

    static constraints = {
        quantityUnit validator: { QuantityUnit r, QuantityStandardUnit ur ->
            if (ur.physicalQuantity == null || ur.physicalQuantity.id == null) return
            boolean existing = false
            QuantityStandardUnit.withNewSession {
                existing = QuantityStandardUnit.exists(ur.physicalQuantity.id, r.id)
            }
            if (existing) {
                return 'quantityStandardUnit.exists'
            }
        }
    }

    static mapping = {
        id composite: ['physicalQuantity', 'quantityUnit']
        version false
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值