我有一个名为Transaction的实体,其数据库中的相关表是TAB_TRANSACTIONS。整个系统工作得很好;现在出现了一个新的要求,即客户要求将超过30天的所有交易转移到另一个存档表,例如, TAB_TRANSACTIONS_HIST。
目前作为一种解决方法,我已经给他们一个计划每24小时运行一次的脚本,它只是将数据从Source移动到Dest。
我想知道使用hibernate有没有更好的解决方案?
我可以获取交易实体,然后将它们存储在TAB_TRANSACTIONS_HISTORY中吗?我看过许多类似的问题,但无法找到解决方案,任何建议都会有所帮助。
答案 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子句”,它可以根据条目的年龄来减少结果。