Получите идентификатор дочернего элемента в отношении cascade=all при добавлении его в коллекцию в Hibernate

у меня есть два объекта, «родительский» и «дочерний», которые связаны двунаправленным отношением «один ко многим» с атрибутом каскада, установленным на «все». При добавлении дочернего объекта в родительскую дочернюю коллекцию с использованием приведенного ниже кода я не могу получить идентификатор сохраненного дочернего элемента, пока не совершу транзакцию:

Parent p = (Parent) session.load(Parent.class, pid);
Child c = new Child();
p.addChild(c);
// "c" hasn't an ID (is always zero) 

Однако, когда я сохраняю дочернюю сущность, явно вызывая метод session.save(), идентификатор создается и устанавливается немедленно, даже если транзакция не была зафиксирована:

Child c = new Child();
session.save(c);
// "c" has an ID

Есть ли способ получить идентификатор дочернего объекта сразу, не вызывая метод session.save()?

Спасибо


person Mark    schedule 07.04.2010    source источник


Ответы (1)


На самом деле это зависит от схемы ID, которую вы используете.

Если вы используете поля с автоматическим увеличением (например, MySQL, SQL Server), идентификатор не будет создан до тех пор, пока сущность не будет сохранена.

Если вы используете последовательности (например, Oracle), идентификатор будет создан при сохранении сущности.

Я предполагаю, что у вас есть поле автоинкремента, и в этом случае ответ: нет, вы не можете получить идентификатор, не сохраняя его. При этом в большинстве случаев вам не нужен этот идентификатор. Отношения с другими объектами обрабатываются неявно. Я предполагаю, что вам нужен идентификатор для какого-то параметра URL или поля формы? В любом случае, да, вам нужно сохранить его.

person cletus    schedule 07.04.2010