grails - 重用域类的属性,约束和行为,而无需继承

标签 grails gorm traits

由于继承,我们正在处理很多问题。我们所做的所有域类都从具有共同属性的Component.groovy扩展而来。
我们需要摆脱该类,但如果可能的话,我们希望将通用属性仅保留在一个位置(在每个表上创建列都没有问题)。
我正在尝试使用Trait来执行此操作,但无法使其正常工作。重要提示:我们正在使用Grails 2.5.2 :(

我们当前的代码是(保持简单):

abstract class Component {

    Date createdDate = new Date()
    Long createdById = 0
    ....

    static constraints = {
        createdDate nullable: false
        createdById nullable: false
        ...
    }

    static mapping = {
        tablePerHierarchy false
    }

    def beforeInsert() {
        def user = Holders.grailsApplication.mainContext.getBean('springSecurityService').currentUser
        if (user) {
            createdById = user.id
            createdDate = new Date()
        }
    }

    def beforeUpdate() {
        ...
    }
}

class User extends Component {
    ...
}

是否有机会不重写每个子类中的每个属性/约束/映射/ beforeInsert等?

最佳答案

Is there a chance to not rewrite every property/constraint/mapping/beforeInsert, etc, in each subclass?



是的,但是正确的解决方案取决于了解您的域。您可以进行复杂的AST转换,可以使用聚合代替继承,可以使用共享约束,可以使用事件侦听器代替beforeInsertbeforeUpdate等。有很多选择。

关于grails - 重用域类的属性,约束和行为,而无需继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59365925/

相关文章:

rust - 使用生命周期参数为特征分离可变借位

generics - 一个函数如何要求一个类型实现一个特征而不删除现有的特征边界?

grails - 能否从域中的belongsTo访问值?

grails - 无法保存域类实例;获取类型不匹配错误

hibernate - Grails- hibernate 联接元素

grails - Groovy totalCount与大小

grails - 数据截断 : Data too long for column grails GSP field

grails - 如何在Bootstrap的Grails audit-trail插件中设置默认的createdBy和editedBy?

hibernate - Grails域类动态列表作为属性

rust - 无法实现自定义特征的 io::Read