Grails 5中使用领域类抽象类时如何合并静态映射
问题描述
我们有一个插件提供的抽象类PaymentAbstract,代码如下:
abstract class PaymentAbstract implements Serializable { static mapping = { tablePerHierarchy false // avoid creating the base_domain table tablePerConcreteClass true token defaultValue: "-1" ... } String token Date authDate ... }
我们在应用中创建了继承该抽象类的Payment类:
class Payment extends PaymentAbstract { String foo ... }
当我们想要为Payment类添加映射公式时,遇到了问题——如果直接在子类中定义static mapping块,会覆盖父类的映射配置,导致丢失支付相关的大量配置细节:
class Payment extends PaymentAbstract { static mapping = { bar formula: "..." ... } String token Date authDate ... }
请问是否有办法合并这两个静态映射?
解决方法
在Grails中,你可以通过引用父类映射配置并合并的方式解决这个问题,以下是两种常用方案:
方案一:直接合并父类映射(无需修改父类)
在子类的mapping块中,先执行父类的映射逻辑,再添加子类自定义的规则:
class Payment extends PaymentAbstract { static mapping = { // 继承父类的所有映射配置 PaymentAbstract.mapping.delegate = delegate PaymentAbstract.mapping.call() // 追加子类自定义映射 bar formula: "..." ... } String foo ... }
方案二:提取父类映射为可复用闭包(需调整父类结构)
如果可以修改父类(或通过插件扩展机制调整),把父类映射定义为独立闭包,子类直接复用并扩展:
// 调整父类映射结构 abstract class PaymentAbstract implements Serializable { static Closure baseMapping = { tablePerHierarchy false tablePerConcreteClass true token defaultValue: "-1" ... } static mapping = baseMapping String token Date authDate ... } // 子类中复用并扩展映射 class Payment extends PaymentAbstract { static mapping = { // 复用父类基础映射 baseMapping.delegate = delegate baseMapping.call() // 添加子类专属映射 bar formula: "..." ... } String foo ... }
注意事项
- 方案一适合父类来自第三方插件、无法修改的场景;
- 方案二代码结构更清晰,但需要具备调整父类代码的权限。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

