У меня есть простой объект, который отображается просто hibernate
class SimpleObject {
private int id;
private String textA;
private String textB;
private Date date;
private Status status;
//+getters/setters/other stuff
}
Теперь, поскольку моя таблица довольно большая (пара миллионов записей), я решил заархивировать все записи, которые мне действительно не нужны (они могут понадобиться пользователю позже, выбрав опцию, которую они должны были бы выбрать). быть в состоянии найти в двух таблицах реальную и архивную, но об этом я пока не делаю, и это будет сделано в другом месте).
Поэтому я решил сохранить свои файлы сопоставления как можно более простыми, а также способ конвертации объекта (архивного / неархивированного) и использования простого наследия
abstract class AbstractSimpleObject {
// idem SimpleObject
}
class SimpleObject extends AbstractSimpleObject {
}
class SimpleObjectArchived extends AbstractSimpleObject {
}
Я использовал 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:[...]
Кто-нибудь знает, как решить эту проблему? Или кто-нибудь уже рассматривал архивирование с помощью hibernate и имеет лучшее решение (или даже работающее решение по архивированию с помощью hibernate)?