1

Transactionという名前のエンティティが1つあり、データベース内の関連テーブルはTAB_TRANSACTIONSです。システム全体はかなり正常に機能しています。これで、クライアントが30日より古いすべてのトランザクションを別のアーカイブテーブル(TAB_TRANSACTIONS_HISTなど)に移動するように要求するという新しい要件が発生しました。

現在、回避策として、24時間ごとに実行するようにスケジュールされたスクリプトを提供しました。このスクリプトは、データをソースから宛先に移動するだけです。

Hibernateを使用してこれにもっと良い解決策があるのだろうかと思っていましたか?

トランザクションエンティティをフェッチして、それらをTAB_TRANSACTIONS_HISTORYに保存できますか?私は多くの同様の質問を調べましたが、それに対する解決策を見つけることができませんでした。どんな提案も役に立ちます。

4

4 に答える 4

1

このタスク用に 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();
        }
    }

}

PS ハイバネートはスケジューラを提供しないため、コア ハイバネートを使用してこのアクティビティを実行することはできず、クォーツ スケジューラなどの外部 API が必要です。

于 2012-05-11T07:28:20.590 に答える
0

ある種のスケジュールメカニズムが必要になります。定期的に起動されるスレッド、または適切な他のトリガーのいずれかです。

一括挿入操作を使用することもできます

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

(... を実際のフィールドに置き換えます)

エントリの古さに基づいて結果をトリミングするために使用できる「where句」を使用することもできます。

于 2012-05-11T11:08:55.193 に答える