2012-05-11 6 views
1

하나의 엔티티 이름이 Transaction이고 데이터베이스의 관련 테이블이 TAB_TRANSACTIONS입니다. 전체 시스템은 꽤 잘 작동합니다. 이제 클라이언트가 30 일보다 오래된 모든 트랜잭션을 다른 아카이브 테이블 (예를 들어, 30 일)으로 이동해야한다는 새로운 요구 사항이 생겼습니다. TAB_TRANSACTIONS_HIST.특정 엔티티를 특정 조건에 따라 다른 테이블에 매핑

현재 해결 방법은 24 시간마다 실행되도록 예약 된 스크립트를 제공합니다.이 스크립트는 원본에서 대상으로 데이터를 단순히 이동합니다.

나는 이것이 최대 절전 모드를 사용하는 어떤 더 좋은 해결책이 있을까 궁금한가요?

트랜잭션 엔터티를 가져 와서 TAB_TRANSACTIONS_HISTORY에 저장할 수 있습니까? 나는 많은 비슷한 질문을 보았지만 그 해결책을 찾지 못했습니다. 어떤 제안이라도 도움이 될 것입니다.

+0

당신이 이미 만든 스케줄러/스크립트를위한 것 같아요. –

+0

@nitin chhajer 예, 이해하지만, 다른 의존성을 추가하고 싶었고 석영 스케쥴러에서 일자리를 예약하고 싶지 않았습니까? –

+1

한 테이블에서 다른 테이블로 복사 할 수있는 석영 스케쥴러 작업에 간단한 HQL을 작성하지 않는 이유는 무엇입니까? –

답변

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. 하이버 네이트는 스케줄러를 제공하지 않으므로 코어 하이버 네이트를 사용하여이 작업을 수행 할 수 없으므로 쿼츠 스케줄러와 같은 외부 API가 필요하다.

1

검색하는 솔루션은 두 가지 다른 지속성 컨텍스트에 의존 할 때만 얻을 수 있습니다.

단일 지속성 컨텍스트는 엔티티를 동적이지 않은 방식으로 테이블에 매핑하므로 매핑 된 테이블에서 다른 테이블로 "런타임 전환"을 수행 할 수 없습니다. 그러나 다른 지속성 컨텍스트 (또는 2 개의 다른 컨텍스트를 사용하는 대신 최대 절전 모드에서 병렬 구성)를 생성 한 다음이 새로운 구성을 다른 EntityManager에로드하고 모든 작업을 수행 할 수 있습니다.

그 순간에 떠오르는 유일한 해결책입니다. 실제로 그것이 적절한 지 모른다 ...

+0

답변을 주셔서 감사합니다. 그래서 다른 절전 모드 구성 및 세션 팩토리를 만들었으며, 프로그램 적으로 런타임에있을 수 있으며 그런 다음이를 통해 개체를 저장할 수 있습니까? –

+0

정확합니다. 하지만이 스위트가 당신의 요구 사항을 충족시키는 지 모르겠다. 그리고 다소 복잡 할 수있다. 적어도 단순한 "런타임 스위치"이상일 것이다. :) – javatutorial

+0

네,하지만 문제는 똑같습니다. 어떻게하면 수업을 바꿀 수 있을까요? 정의, 나는 주석을 사용하여 매핑을 의미하고 심지어 런타임을 사용하여 다른 테이블에 매핑하는 방법을 모르겠다면 죄송합니다. 너무 바보 같아서 물어보십시오 –

0

나는 매 24 시간마다 스크립트를 실행하는 것이 좋습니다. 행복하지 않은 경우 간격을 줄여서 삭제할 수 있습니다.

하지만 실제로 작동하는 스크립트가 있다면 실제 문제는 어디에 있습니까? 모든 거래의 나이를 확인하고 30 일보다 오래된 거래를 다른 목록이나지도로 옮기는 것이 내가 생각하는 최선의 방법입니다.

+0

대답을 주셔서 감사합니다, 아니 문제는 내가이 애플 리케이션을 호스팅하고 스크립트를 실행하거나 다른 사람이 수동으로 시간에 물건을 트리거하는 또 다른 전용 컴퓨터가 필요합니다, 그래서 만약 내가 웹 애플 리케이션에 그것을 통합 할 수 궁금 해서요 구성되거나 트리거 될 때마다 자동으로 실행되는 자체 –

0

일종의 스케줄 메커니즘이 필요할 것이다. 주기적으로 깨우는 쓰레드 또는 당신에게 적합한 다른 트리거.

또한 (실제 필드 교체 ...)

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

가 대량 삽입 작업 또한에 사용할 수있다 "절은"아래로 트림 결과를 사용할 수 있습니다

을 사용할 수 있습니다 항목이 얼마나 오래된지를 기준으로합니다.

관련 문제