#grails
#grails
Вопрос:
у меня есть следующая схема класса домена:
class A { static hasMany=[abRelations: AB] }
class B { static hasMany=[abRelations: AB] }
//relation table
class AB{
A a
B b
String someAttribute
}
в некоторых случаях мне определенно нужна ассоциация сокращений, например, запросы hql, критерии, …
моя проблема в том, что когда я создаю новую запись AB с
new AB(a: a, b: b, someAttribute: "hello").save()
поля версий A и B увеличиваются. могу ли я избежать этого, добавив специальную опцию сопоставления или что-то в этомроде? я использую событие afterUpate в некоторых классах, и это событие также запускается при добавлении новых отношений -> это моя главная проблема!
Ответ №1:
Вы можете полностью удалить поле версии, добавив следующее в класс домена
static mapping = {
version false
}
Я понимаю, что нет способа осуществлять детальный контроль над тем, когда version
поле увеличивается. У вас либо есть version
поле, и оно автоматически увеличивается при каждом обновлении объекта домена, либо у вас его вообще нет.
Комментарии:
1. спасибо за ответ, я подумал, что, вероятно, есть другое решение. я не хочу терять функциональность оптимистичной блокировки, удаляя поля версии из A и B. лучшим решением для моей проблемы было бы вызвать код при последующем закрытии вручную.
Ответ №2:
Если вы не хотите увеличивать версии A и B, сохраняйте однонаправленные отношения, чтобы A и B не знали об отношениях AB.
Комментарии:
1. спасибо, но мне нужны отношения для выполнения запросов и критериев hql. в противном случае вы получили бы hibernate path execption для этих отсутствующих ассоциаций.