1

我有一个名为 Transaction 的实体,它在数据库中的相关表是 TAB_TRANSACTIONS。整个系统运行良好;现在出现了一个新要求,其中客户要求将所有超过 30 天的事务移到另一个存档表,例如 TAB_TRANSACTIONS_HIST。

目前,作为一种解决方法,我给了他们一个计划每 24 小时运行一次的脚本,它只是将数据从 Source 移动到 Dest。

我想知道使用休眠有没有更好的解决方案?

我可以获取事务实体,然后将它们存储在 TAB_TRANSACTIONS_HISTORY 中吗?我查看了许多类似的问题,但找不到解决方案,任何建议都会有所帮助。

4

4 回答 4

1

我认为,只有依靠两种不同的持久性上下文才能实现您搜索的解决方案。

单个持久性上下文以非动态方式将实体映射到表,因此您无法执行从映射表到另一个表的“运行时切换”。但是您可以创建一个不同的持久性上下文(或在休眠中并行配置,而不是使用 2 个不同的上下文),然后在不同的 EntityManager 中加载这个新配置,并执行所有任务。

这是目前唯一想到的解决方案。真的不知道够不够。。。

于 2012-05-11T07:08:02.450 回答
1

您可能希望为此任务创建一个石英调度程序。这是Job调度程序

public class DatabaseBackupJob implements Job {
    public void execute(JobExecutionContext jec) throws JobExecutionException {
        Configuration cfg=new Configuration();
        cfg.configure("hibernate.cfg.xml");
        Session session = cfg.buildSessionFactory().openSession();
        Query q = session.createQuery("insert into Tab_Transaction_History(trans) select t.trans as trans from Tab_Transaction t where t.date < :date")
        .setParameter("date", reqDate);
        try{
           Trasaction t = session.beginTransaction();
           q.executeNonQuery();
           t.commit();
        } catch(Exception e){
        } finally {
           session.close();
        }
    }

}

PS hibernate 不提供调度程序,因此您无法使用核心 hibernate 执行此活动,因此您需要外部 API,如石英调度程序

于 2012-05-11T07:28:20.590 回答
0

我认为每 24 小时运行一次脚本是个好主意。如果你不开心,你可以缩短间隔。

但是,如果您已经有一个工作脚本,那么您的实际问题在哪里?检查所有交易的年龄并将超过 30 天的交易移动到另一个列表或地图是我认为的最佳方式。

于 2012-05-11T07:08:29.270 回答
0

您将需要某种调度机制。可以是定期唤醒的线程,也可以是其他适合您的触发器。

您还可以使用批量插入操作

Query q = session.createQuery(
"insert into TabTransactionHistory tth
(.....)
select .... from TabTransaction tt"
);
int createdObjects = q.executeUpdate();

(用实际字段替换 ...)

您还可以使用“where 子句”,该子句可用于根据条目的年龄来缩减结果。

于 2012-05-11T11:08:55.193 回答