У меня проблема с привязкой данных и грязными свойствами. Существует два простых домена:
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.