我有一個是通過簡單地映射到一個簡單的對象冬眠歸檔與Java /休眠
class SimpleObject {
private int id;
private String textA;
private String textB;
private Date date;
private Status status;
//+getters/setters/other stuff
}
現在,因爲我的表gettig相當龐大(幾百萬個條目的),我決定歸檔所有的我真的不需要這些條目(用戶以後可能需要它們,通過檢查一個選項他們可以搜索兩個表格中的實際和存檔,但這是我現在還不知道的事情,哪些將會在其他地方完成)。
所以我決定繼續我的映射文件儘可能的簡單,並轉換被攝體的方式(歸檔/非歸檔),並使用簡單的遺產
abstract class AbstractSimpleObject {
// idem SimpleObject
}
class SimpleObject extends AbstractSimpleObject {
}
class SimpleObjectArchived extends AbstractSimpleObject {
}
我以前工會子類在我的hibernate映射並將SimpleObject映射到我的舊錶,並將SimpleObjectArchived映射到相同的表。
現在一切正常,我可以刪除/創建/更新我的對象。 我們歸檔:
在我SimpleObjectBusinessRules I類定義的方法檔案:
class SimpleObjectBusinessRules {
// the daos for the SimpleObject and the SimpleObjectArchived both using HibernateDaoSupport
SODao soDao;
SOADao soaDao;
//...
//you can say which objects to archive by some criterias
public void archive(Map<String,Object> pCrit) {
List<SimpleObject> lSOs = soDao.getByCriteria(pCrit);
//I wrote myself a converter (based on dozer)
List<SimpleObjectArchived> lSOAs = Converter.convertToSOA(lSOs);
soDao.deleteAll(lSOs);
soaDao.saveAll(lSOAs); //based on getHibernateTemplate().saveOrUpdateAll(pEntities)
}
}
我中省略所有的try/catch/... 我得到saoDao.saveAll(...)
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:[...]
任何人有任何想法如何解決這個問題?或者任何人已經使用hibernate處理過歸檔,並且有更好的解決方案(或者甚至是如何使用休眠存檔的工作解決方案)?
我該如何確保**在刪除和插入存檔之間,我的對象不會丟失(如果某處出現問題/不知何故)?這就是爲什麼我認爲可能需要在一個會話中完成所有事情...... – jacob 2011-01-05 10:39:51
您可以跨越多個會話的交易。關鍵字是DTC,分佈式事務。您可以爲Hibernate啓用它們,並且您的兩個會話將共享一個事務。 – Falcon 2011-01-05 10:43:26
我會試一試。感謝至今 – jacob 2011-01-05 10:48:38