gpt4 book ai didi

java - 使用 Java/Hibernate 归档

转载 作者:行者123 更新时间:2023-11-30 05:07:25 25 4
gpt4 key购买 nike

我有一个简单的对象,它仅由 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 {

}

我在 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(...) 上遇到 hibernate 异常org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与 session 关联:[...]

有人知道如何解决这个问题吗?或者任何人已经使用 hibernate 归档并有更好的解决方案(甚至是如何使用 hibernate 归档的可行解决方案)?

最佳答案

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

我不会像您那样用归档逻辑污染我的完整继承层次结构,除非它在您的业务逻辑中的其他地方使用(它可能不是)。只需使用两个 session 并将存档记录放入另一个架构或数据库或表中( session 的映射由您决定)。

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

关于java - 使用 Java/Hibernate 归档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4603027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com