Проверка, если дублирующий дочерний объект уже существует, при нажатии на Graph - PullRequest
0 голосов
/ 06 августа 2009

Учитывая Hibernate 3,

У меня есть родительская таблица и дочерняя таблица, связанные внешним ключом. Я объявляю ассоциацию многие-к-одному в родительский файл hbm с каскадным свойством all. Сначала я сохраняю родителя (сохраняю или сохраняю), и это сохраняет родителя и ребенка. Хорошо пока. Но в другом сеансе я создаю новый родительский объект (функционально отличающийся от первого сеанса) и делаю ссылку на новый дочерний объект (но функционально тот же, что и первый сеанс, и это Переходный объект на данный момент)

Я хотел бы знать, может ли Hibernate изначально поддерживать и определить, что я управляю одним и тем же ребенком (и поэтому не пытайтесь сохранить его при сохранении нового родителя), или мне нужно разработать обходной путь к базе данных и проверить если ребенок уже присутствует?

Спасибо всем

1 Ответ

2 голосов
/ 06 августа 2009

Hibernate идентифицирует объекты по первичному ключу. Таким образом, если эти два дочерних элемента имеют один и тот же первичный ключ, который должен быть сгенерированным бизнесом ключом, Hibernate будет знать, что это один и тот же объект. НО, он все еще не знает, следует ли ему выполнить обновление или вставку в базу данных. Вы можете явно merge вызвать дочерний объект, Hibernate будет искать его в базе данных и либо создавать, либо обновлять его.

НО, это не так просто, как это:

Одной из проблем является ключ, генерируемый бизнесом. Лучше позволить Hibernate генерировать суррогатные ключи.

Другая проблема заключается в необходимости использовать merge, который должен использоваться всегда, если этот класс хранится. Подумайте об удалении каскада, потому что вы все равно должны его явно хранить.

Обратите внимание, что merge возвращает другой экземпляр, который необходимо использовать. (это означает: присвойте возвращаемое значение merge свойству родителя.)

Корневая проблема , которую вы получили, заключается в том, что бизнес-логика создает один и тот же объект дважды. Если вы хотите повторно использовать экземпляр, созданный кем-то другим, вам нужно получить его, либо выполнив поиск в базе данных, либо передав его в качестве аргумента. Попробуйте решить проблему следующим образом, прежде чем пытаться решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...