有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

目前,作为一项工作,我给了他们一个脚本,计划每24小时运行一次,它只需将数据从源移动到目标

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

我是否可以获取事务实体,然后将它们存储在TAB_TRANSACTIONS_HISTORY中?我看了很多类似的问题,但找不到解决办法,任何建议都会有帮助


共 (4) 个答案

  1. # 1 楼答案

    你需要某种安排机制。要么是周期性唤醒的线程,要么是适合您的其他触发器

    也可以使用批量插入操作

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

    (将…替换为实际字段)

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

  2. # 2 楼答案

    您可能需要为此任务创建quartz计划程序。下面是调度程序的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();
            }
        }
    
    }
    

    另一方面,hibernate不提供调度器,因此您无法使用核心hibernate执行此活动,因此您需要像quartz调度器这样的外部API

  3. # 3 楼答案

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

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

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

  4. # 4 楼答案

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

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