根据特定条件将实体映射到不同的表

时间:2012-05-11 06:36:13

标签: java hibernate jpa orm

我有一个名为Transaction的实体,其数据库中的相关表是TAB_TRANSACTIONS。整个系统工作得很好;现在出现了一个新的要求,即客户要求将超过30天的所有交易转移到另一个存档表,例如, TAB_TRANSACTIONS_HIST。

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

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

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

4 个答案:

答案 0 :(得分:1)

我认为,只有依靠两种不同的持久化背景,才能实现搜索的解决方案。

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

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

答案 1 :(得分: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();
        }
    }

}

P.S。 hibernate不提供调度程序,因此您无法使用核心hibernate执行此活动,因此您需要外部API,如quartz scheduler

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

您需要某种计划机制。定期唤醒的线程,或者适合您的其他触发器。

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

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

(将...替换为实际字段)

你也可以使用“where子句”,它可以根据条目的年龄来减少结果。

相关问题