我遇到了一個問題,我試圖在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"/>
編輯 - 當我插入的數據插入到家長和孩子。
當我使用一個新的對象的ID與對象的ID進行更新時,我想要修改父級更新,但是第二次添加任何現有的子級。我似乎無法刪除孩子。當我使用ID檢索一個對象並修改它時,我得到一個錯誤告訴我org.hibernate.LazyInitializationException:無法初始化代理 - 擁有的Session被關閉。我懷疑這是因爲在一個getHibernateTemplate()調用中,我得到的對象,我將它保存在另一個,這是兩個不同的會話?
當我做刪除時,我得到一個錯誤,因爲孩子存在。我知道我只是在做一些愚蠢的事情,因爲缺乏對這一切如何運作的線索。
這裏是我的更新和刪除方法,在這種情況下,更新/保存是在保存前檢索和修改。刪除使用新的對象具有相同ID作爲一個在DB我想刪除:
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);
}
你可以添加hibernate映射嗎?你有沒有爲關係指定級聯? – 2009-09-17 15:34:22
'all,delete-orphan'不是級聯標識符。 'all-delete-orphan'是。 – Jherico 2009-09-17 17:54:40
@Jherico - 兩者完全一樣:http://docs.jboss.org/hibernate/stable/core/reference/en/html/collections.html#collections-mapping。 「all」和「delete-orphan」是有效的級聯操作,可以用逗號分隔多個值。 – ChssPly76 2009-09-17 18:23:07