Grails,GORM-绑定OneToMany数据时没有脏属性

Grails,GORM-绑定OneToMany数据时没有脏属性,grails,groovy,gorm,Grails,Groovy,Gorm,我在数据绑定和脏属性方面有问题。 有两个简单的域 class Parent { String name static hasMany = [children: Child] } 我创建了一个简单的rest控制器来检查所有选项 class TestController { static responseFormats = ['json'] @Transactional def add() { def parent = new Paren

我在数据绑定和脏属性方面有问题。 有两个简单的域

class Parent {
    String name

    static hasMany = [children: Child]
}
我创建了一个简单的rest控制器来检查所有选项

class TestController {
    static responseFormats = ['json']

    @Transactional
    def add() {
        def parent = new Parent(name: params.name).save()
        respond(parent)
    }

    @Transactional
    def parents() {
        def parents = Parent.findAll()
        respond(parents)
    }

    @Transactional
    def testWithCommand(ParentCmd cmd) {
        Parent parent = Parent.findById(cmd.id)
        bindData(parent, cmd)
        parent.save()

        respond(parent)
    }

    @Transactional
    def testWithParams() {
        Parent parent = Parent.findById(params.id)
        bindData(parent, params)
        parent.save()

        respond(parent)
    }

    @Transactional
    def testWithRelation(ParentCmd cmd) {
        Parent tempParent = new Parent()
        bindData(tempParent, cmd)

        Parent parent = Parent.findById(cmd.id)

        for (Child child : tempParent.children) {
            parent.addToChildren(child)
        }

        parent.save()

        respond(parent)
    }
}
所以我们有3个更新选项:带绑定的cmd、带绑定的params和带addTo的cmd*

我创建了简单事件来捕获脏属性

class TestEventListener extends AbstractPersistenceEventListener {
    protected TestEventListener(Datastore datastore) {
        super(datastore)
    }

    @Override
    protected void onPersistenceEvent(AbstractPersistenceEvent event) {
        if (event.entityObject instanceof Parent) {
            List<String> dirtyProperties = new ArrayList<String>(((DirtyCheckable) event.entityObject).listDirtyPropertyNames())
            println("DIRTY PROPERTIES: " + dirtyProperties.size())
            println(dirtyProperties.join(", "))
        }

    }

    @Override
    boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
        eventType == PreUpdateEvent.class
    }
}
类TestEventListener扩展了AbstractPersistenceEventListener{
受保护的TestEventListener(数据存储数据存储){
超级(数据存储)
}
@凌驾
受保护的void onPersistenceEvent(AbstractPersistenceEvent事件){
if(父级的event.entityObject instanceof){
List dirtyproperty=new ArrayList(((DirtyCheckable)event.entityObject.listDirtyPropertyNames())
println(“脏属性:+dirtyproperty.size())
println(dirtyProperty.join(“,”))
}
}
@凌驾
布尔支持SeventType(类
class TestEventListener extends AbstractPersistenceEventListener {
    protected TestEventListener(Datastore datastore) {
        super(datastore)
    }

    @Override
    protected void onPersistenceEvent(AbstractPersistenceEvent event) {
        if (event.entityObject instanceof Parent) {
            List<String> dirtyProperties = new ArrayList<String>(((DirtyCheckable) event.entityObject).listDirtyPropertyNames())
            println("DIRTY PROPERTIES: " + dirtyProperties.size())
            println(dirtyProperties.join(", "))
        }

    }

    @Override
    boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
        eventType == PreUpdateEvent.class
    }
}