У меня проблема с удалением, которое я пытаюсь сделать в Hibernate. Каждый раз, когда я пытаюсь удалить, я получаю проблему из-за существующих дочерних записей, поэтому она не может удалить родителя. Я хочу удалить детей и родителей. Вот мое родительское отображение:
<set name="communicationCountries" inverse="true" cascade="all,delete-orphan">
<key column="COM_ID" not-null="true" on-delete="cascade" />
<one-to-many class="com.fmr.fc.portlet.communications.vo.CommunicationCountry"/>
</set>
Вот отображение для дочернего класса:
<many-to-one name="communication" column="COM_ID" not-null="true" class="com.fmr.fc.portlet.communications.vo.Communication" cascade="all"/>
РЕДАКТИРОВАТЬ - Когда я делаю вставку, данные вставляются в родительский и дочерний.
Когда я делаю обновление, используя новый объект с идентификатором объекта, который я хочу изменить, родительский объект обновляется, но все существующие дочерние элементы добавляются во второй раз. Я не могу удалить детей. Когда я получаю объект, используя идентификатор и изменяю его, я получаю сообщение об ошибке org.hibernate.LazyInitializationException: не удалось инициализировать прокси-сервер - сеанс-владелец был закрыт. Я подозреваю, что это потому, что в одном вызове getHibernateTemplate () я получаю объект и сохраняю его в другом, и это два разных сеанса?
Когда я делаю удаление, я получаю ошибку, потому что дети существуют. Я знаю, что просто делаю что-то глупое из-за отсутствия понятия о том, как все это работает.
Вот мои методы обновления и удаления, в этом случае обновление / сохранение извлекается и изменяется перед сохранением. Для удаления используется новый объект с тем же идентификатором, что и в БД, которую я хочу удалить:
public void deleteCommunication(Communication comm) throws DataAccessException
{
getHibernateTemplate().delete(comm);
}
public void saveCommunication(Communication comm) throws DataAccessException
{
Communication existing = (Communication)getHibernateTemplate().load(Communication.class, comm.getComId());
existing.getCommunicationCountries().clear();
getHibernateTemplate().saveOrUpdate(existing);
}
UPDATE
Итак, вот мои новые методы, но до сих пор нет радости. Я думаю, что моя проблема связана с тем, что потомки не загружаются / не инициализируются и т. Д. С удалением я не могу понять, почему не происходит каскадное удаление.
Большое спасибо за вашу помощь. У меня уже установлен срок выполнения этой работы, поэтому, если я не исправлю его в выходные, мне просто придется прибегнуть к выполнению HQL-запросов, поскольку я знаю, что это будет работать для меня: (
public void deleteCommunication(Integer id) throws DataAccessException
{
HibernateTemplate hibernate = getHibernateTemplate();
Communication existing = (Communication)hibernate.get(Communication.class, id);
hibernate.initialize( existing.getCommunicationCountries());
hibernate.delete(existing);
}
public void updateCommunication(Communication comm) throws DataAccessException
{
HibernateTemplate hibernate = getHibernateTemplate();
Communication existing = (Communication)hibernate.get(Communication.class, comm.getComId());
hibernate.initialize( existing.getCommunicationCountries());
existing.getCommunicationCountries().clear();
hibernate.saveOrUpdate(existing);
}