使用Java/Hibernate进行归档

使用Java/Hibernate进行归档,java,hibernate,archiving,Java,Hibernate,Archiving,我有一个简单的对象,它只是通过hibernate映射的 class SimpleObject { private int id; private String textA; private String textB; private Date date; private Status status; //+getters/setters/other stuff } 现在,由于我的表非常大(有几百万个条目),我决定归档所有我并不真正需要的条目(用户稍后可能需要

我有一个简单的对象,它只是通过hibernate映射的

class SimpleObject {
   private int id;
   private String textA;
   private String textB;
   private Date date;
   private Status status;
   //+getters/setters/other stuff
}
现在,由于我的表非常大(有几百万个条目),我决定归档所有我并不真正需要的条目(用户稍后可能需要它们,通过选中一个选项,他们将能够搜索两个表(实际表和存档表),但这是一件我还没有进行的事情,这将在其他地方进行)。
因此,我决定尽可能地简化映射文件,以及转换对象(已存档/未存档)和使用simple heritage的方式

abstract class AbstractSimpleObject {
    // idem SimpleObject
}

class SimpleObject extends AbstractSimpleObject {

}

class SimpleObjectArchived extends AbstractSimpleObject {

}
我在hibernate映射中使用了union子类,并将SimpleObject映射到了我的旧表,而SimpleObject则存档到了一个相同的表中。
到目前为止,一切都很好,我可以删除/创建/更新我的对象。 现在,请看归档:

在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)
    }
}
类SimpleObject业务规则{
//SimpleObject和SimpleObject的DAO都是使用HibernateDataOSupport归档的
索道索道;
松岛松岛;
//...
//您可以根据一些标准来确定要归档的对象
公共作废档案(Map pCrit){
列表LSO=soDao.getByCriteria(pCrit);
//我自己写了一个转换器(基于推土机)
列表lSOAs=Converter.convertToSOA(lSOs);
soDao.deleteAll(LSO);
soaDao.saveAll(lSOAs);//基于getHibernateTemplate().saveOrUpdateAll(Penties)
}
}
我接受了所有的尝试/捕获。。。 我在
saodo.saveAll(…)
org.hibernate.unUniqueObjectException:具有相同标识符值的不同对象已与会话关联:[……]


有人知道如何解决这个问题吗?或者有人已经用hibernate处理过归档问题,并且有更好的解决方案(或者甚至有一个工作解决方案如何用hibernate归档)?

我只需创建两个会话,一个业务逻辑会话和一个归档会话,从业务逻辑会话中删除对象,并将转换后的对象保存到归档会话。您可以在DAO中实现归档方法。这将为您省去很多麻烦

我不会走到你这一步,用归档逻辑破坏我完整的继承层次结构,除非它在你的业务逻辑中的其他地方使用(可能不是)。只需使用两个会话,并将归档记录放在另一个模式、数据库或表中(会话的映射由你决定)


顺便说一句:由于您的映射策略,会发生异常。使用Union子类映射,所有标识符都存储在同一个表中,因此存档记录和业务逻辑记录都是从同一个池中馈送ID。您需要一个自定义生成策略来避免该异常或更改映射。但是,当出现异常时,为什么还要费事呢对于您的问题(归档会话),有什么更优雅的解决方案?

如何确保我的对象不会丢失(如果某处/以某种方式出现问题)在删除和插入存档之间?这就是为什么我认为可能需要在一个会话中完成所有操作…您可以跨越多个会话的事务。关键字是DTC,distributed transactions。您可以将它们启用为Hibernate,并且您的两个会话都将共享一个事务。我将尝试一下。感谢您的支持