休止状態によって単純にマップされる単純なオブジェクトがあります
class SimpleObject {
private int id;
private String textA;
private String textB;
private Date date;
private Status status;
//+getters/setters/other stuff
}
ここで、私のテーブルが非常に大きくなったため (数百万のエントリ)、実際には必要のないすべてのエントリをアーカイブすることにしました (ユーザーが後でそれらを必要とする可能性があるため、オプションをチェックして、できるようにする必要があります)。実際のテーブルとアーカイブされた 2 つのテーブルを検索しますが、それは私がまだ気にしていないことであり、別の場所で行われる予定です)。
そこで、マッピング ファイルをできるだけシンプルにし、オブジェクト (アーカイブ済み/非アーカイブ済み) を変換する方法と単純な遺産を使用することにしました。
abstract class AbstractSimpleObject {
// idem SimpleObject
}
class SimpleObject extends AbstractSimpleObject {
}
class SimpleObjectArchived extends AbstractSimpleObject {
}
Hibernate マッピングでunion-subclassを使用し、SimpleObject を古いテーブルにマップし、SimpleObjectArchived を同一のテーブルにマップしました。
これまでのところ、すべて問題ありません。オブジェクトを削除/作成/更新できます。次にアーカイブに進みます。
SimpleObjectBusinessRules クラスで、メソッド アーカイブを定義します。
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:[...]
この問題を解決する方法を知っている人はいますか? または、すでに休止状態でアーカイブを処理していて、より良い解決策を持っている人はいますか (または、休止状態でアーカイブするための実用的な解決策さえありますか)?