Будьте в спящем режиме (JPA), каскад - получает идентификатор от ребенка

У меня есть родительский класс со следующим полем с каскадной опцией:

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 дочерняя ссылка, которая я вставил в свой родительский объект, изменили, означая, что я не могу получить идентификатор своего сохраненного ребенка. Есть ли какой-либо способ, которым я могу сказать, в спящем режиме, чтобы снова использовать мою старую дочернюю ссылку вместо того, чтобы делать новую? во время слияния

7
задан Bozho 18 November 2010 в 15:10
поделиться

2 ответа

Просто получите объединенный экземпляр вашего родителя:

parent = entityManager.merge(parent);

Обновление:

То, что вы хотите, невозможно. Либо вручную слияние () () Ребенок, а затем добавьте его в родитель, или получить новый ребенок из родительской коллекции и вместо этого использовать его.

1
ответ дан 7 December 2019 в 18:43
поделиться

Для многих действий 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 может быть разной, но я подозреваю, что это возможно, и надеюсь, что это дает подсказки.

1
ответ дан 7 December 2019 в 18:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: