Архивирование с помощью Java / Hibernate - PullRequest
1 голос
/ 05 января 2011

У меня есть простой объект, который отображается просто 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)?

1 Ответ

2 голосов
/ 05 января 2011

Я бы просто создал два сеанса, один сеанс бизнес-логики и один сеанс архива, удалил объект из сеанса бизнес-логики и сохранил преобразованный объект в сеанс архива.Вы можете реализовать архивный метод в вашем DAO.Это избавит вас от многих проблем.

Я бы не пошел так далеко, как вы, и не испортил бы мою полную иерархию наследования с помощью логики архивации, если только она не используется где-либо в вашей бизнес-логике (вероятно, нет),Просто используйте два сеанса и поместите архивированные записи в другую схему, базу данных или таблицу (сопоставление для сеанса зависит от вас).

Кстати: исключение происходит из-за вашей стратегии сопоставления.При использовании Union-Subclass-Mapping все идентификаторы хранятся в одной и той же таблице, поэтому архивные записи и записи бизнес-логики передаются идентификаторам из одного и того же пула.Вам потребуется специальная стратегия генерации, чтобы избежать этого исключения или изменить отображение.Но зачем беспокоиться, если есть более элегантное решение вашей проблемы (сеанс архивирования)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...