У меня есть родительский класс со следующим полем с каскадной опцией:
public class Parent {
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private final Set<Child> children = new HashSet<Child>();
public addChild(Child child) { children.add(child); }
}
В моем приложении я хочу добавить ребенка и затем назвать слияние JPA на родительском классе, автоматически сохраняя моего нового ребенка. Это все, которое работы, однако, origional дочерняя ссылка, которая я вставил в свой родительский объект, изменили, означая, что я не могу получить идентификатор своего сохраненного ребенка. Есть ли какой-либо способ, которым я могу сказать, в спящем режиме, чтобы снова использовать мою старую дочернюю ссылку вместо того, чтобы делать новую? во время слияния
Просто получите объединенный экземпляр вашего родителя:
parent = entityManager.merge(parent);
Обновление:
То, что вы хотите, невозможно. Либо вручную слияние ()
() Ребенок, а затем добавьте его в родитель, или получить новый ребенок из родительской коллекции и вместо этого использовать его.
Для многих действий Hibernate генерирует событие, которое можно прослушать, а какой-то код поддержки для прослушивания.
Если вы используете пружину в сочетании с Hibernate, например, вы можете зарегистрировать класс org.springframework.orm.hibernate3.support.idtransferringMergeeventListener в качестве слушателя для мероприятия Hibernate (от я думаю, что Spring-Orm.jar) Применяя следующее в вашем Hibernate.cfg.xml (или любой файл ссылается на вашу настроек пружины для Hibernate Config):
<event type="merge">
<listener class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener"/>
</event>
или путем добавления карты в бобовом заседании Sessionactory:
<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>
Если вы делаете один из них, это Слушатель должен установить идентификатор в исходном объекте. Если вы не используете весну, вероятно, способ подключить слушателя, который аналогичен одному из них.
Я не проверил поведение ребенка, которое вы ищете, но я уверен, что слияние на родитель спутать слияние на ребенка, чтобы слушатель был вызван для обоих.
Настройка для JPA может быть разной, но я подозреваю, что это возможно, и надеюсь, что это дает подсказки.