Grails, GORM - Нет грязных свойств при привязке данных OneToMany - PullRequest
1 голос
/ 30 марта 2020

У меня проблема с привязкой данных и грязными свойствами. Существует два простых домена:

class Parent {
    String name

    static hasMany = [children: Child]
}
class Child {
    String name

    static belongsTo = [parent: Parent]
}

Я создал простой контроллер отдыха, чтобы проверить все параметры

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 с привязкой, параметры с привязкой и cmd с addTo *

Я создал простое событие для отлова грязных свойств

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
    }
}

Затем я использовал Postman, я создал одну запись и обновил ее каждым из трех способов.

В двух случаях не было грязных свойств.
Только когда я использовал addToChildren() Я видел children в грязных свойствах.

Кто-нибудь знает об этом?
Были ли у вас проблемы с привязкой? Это нормально или я что-то упустил?

Буду благодарен за каждый ответ.

Thx, A.

...