Для многих действий Hibernate генерирует событие, которое можно прослушивать, и некоторый код поддержки для прослушивания.
Если вы используете Spring вместе с Hibernate, например, вы можете зарегистрировать класс org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener в качестве прослушивателя события слияния hibernate (из, я думаю, Spring-orm.jar) добавив в файл hibernate.cfg.xml следующее (или любой другой файл, на который есть ссылка в вашей весенней установке для конфигурации hibernate):
<event type="merge">
<listener class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener"/>
</event>
или добавив карту в ваш сессионный компонент:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
p:dataSource-ref="dataSource">
<property name="configLocation" value="WEB-INF/classes/hibernate.cfg.xml"/>
<property name="eventListeners">
<map>
<entry key="merge">
<bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener"/>
</entry>
</map>
</property>
Если вы выполните одно из этих действий, этот слушатель должен установить идентификатор в исходном объекте. Если вы не используете Spring, вероятно, есть способ подключить слушателя, который похож на один из них.
Я не проверял искомое поведение, которое вы ищете, но я уверен, что слияние с родителем вызовет слияние с дочерним, так что слушатель будет вызываться для обоих.
Настройки для JPA могут отличаться, но я подозреваю, что это возможно, и надеюсь, что это дает подсказки.