2011-01-05 44 views
1

我有一個是通過簡單地映射到一個簡單的對象冬眠歸檔與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處理過歸檔,並且有更好的解決方案(或者甚至是如何使用休眠存檔的工作解決方案)?

回答

2

我剛剛創建兩個會話,一個業務邏輯會話和一個歸檔會話,從業務邏輯會話中刪除該對象,並將轉換後的對象保存到歸檔會話中。你可以在你的DAO中實現一個存檔方法。這會給你帶來很多麻煩。

我不會走得儘可能遠,並污染我的完整繼承層次與歸檔邏輯,除非它在業務邏輯(它可能不是)其他地方使用。只需使用兩個會話並將已歸檔的記錄放入另一個模式或數據庫或表中(該會話的映射由您決定)。

順便說一句:由於您的映射策略而發生異常。使用Union-Subclass-Mapping,所有標識符都存儲在同一個表中,因此歸檔記錄和業務邏輯記錄是從同一個池中提供的ID。您需要自定義生成策略來避免該異常或更改映射。但是,當您的問題存在更優雅的解決方案(存檔會話)時,爲什麼還要這麼做呢?

+1

我該如何確保**在刪除和插入存檔之間,我的對象不會丟失(如果某處出現問題/不知何故)?這就是爲什麼我認爲可能需要在一個會話中完成所有事情...... – jacob 2011-01-05 10:39:51

+1

您可以跨越多個會話的交易。關鍵字是DTC,分佈式事務。您可以爲Hibernate啓用它們,並且您的兩個會話將共享一個事務。 – Falcon 2011-01-05 10:43:26

+0

我會試一試。感謝至今 – jacob 2011-01-05 10:48:38