2017-12-08 4 views
15

질문이 있습니다. 이 방법들은 어디로 갔습니까?Hibernate에서 임시 테이블을 사용하여 레코드를 대량으로 삭제하는 방법은 무엇입니까?

Dialect.supportsTemporaryTables(); 
Dialect.generateTemporaryTableName(); 
Dialect.dropTemporaryTableAfterUse(); 
Dialect.getDropTemporaryTableString(); 

나는 Dialect.java에 대한 자식의 역사를 찾아 시도,하지만 운했습니다. MultiTableBulkIdStrategy과 같은 것을 발견했지만 사용법에 대한 예제를 찾을 수 없습니다.

하려면 ... 임시 테이블을 사용하여 일괄 삭제를 수행하는 레거시 코드 (최대 절전 모드 4.3.11 사용)가 있습니다. 이 테이블에는 1000 개의 행이있을 수 있지만, 은 10 밀리 행이 될 수 있습니다. 그래서 나는 단지 미친 삭제와 DB를 죽이지 않는지 내가 임시 테이블을 작성 (일부 조건을 사용하여 select 쿼리 사용) 1000 ID를 누른 다음이 임시 테이블을 사용하여 4 테이블에서 데이터를 삭제합니다. 일부 조건을 기반으로하는 모든 데이터가 삭제되지 않을 때까지 주기적으로 실행됩니다. 트랜잭션은 매주기마다 커밋됩니다.

이 코드는 mysql, mariadb, oracle, postgresql, sqlserver 및 h2 위에 실행해야합니다.

위에서 언급 한 방법으로 원시 SQL을 사용하여 수행되었습니다. 하지만 리팩터링하는 방법을 찾을 수 없습니다. .

내 첫 번째 시도가 쿼리를 만드는 것이었다하면이 같은 선택 중첩 사용 : delete from TABLE where id in (select id from TABLE where CONDITION limit 1000)하지만 각 삭제하고 limit은 HQL에서 중첩 된 선택에서 지원되지 않습니다에 대한 선택 쿼리를 여러 번 실행해야으로이 방법이 느립니다.

아이디어 나 지침이 있으십니까?

감사합니다.

+1

답변이 '잘 되었어요'라고 말하면 다른 사람이 임시 테이블없이 문제의 해결 방법에 대한 제안을 할 수 있도록 귀하의 유스 케이스를 자세히 설명해 주시겠습니까? –

+1

아마도이 정보는 http://in.relation.to/2017/02/01/non-temporary-table-bulk-id-strategies/에 도움이됩니까? – Ivan

+0

https://github.com/grimsa/hibernate-single-table-bulk-id-strategy –

답변

4

이 방법은 version 4.3.11에 존재하지만, version 5.0.0에서 제거되었다. 사용되지 않는 것이 아니라 제거 된 것이 약간 이상한 것 같습니다. 배경은 this Jira ticket입니다.

이 인용합니다 :

이 가 는
가 이

장기, 내가 가장 좋은 방법은 단편적인 방식으로 상정 테이블을 지원하고 완전히 자체 포함 할 MultiTableBulkIdStrategy 를 만들기 위해 의도 방언 방법 을 제거하는 것입니다 생각 계약.

this commit에서 제거되었습니다.

그래서 getDefaultMultiTableBulkIdStrategy()이이 메소드의 대체품으로 보이지만 현재 Javadoc이 없기 때문에 어떻게하는지 명확하게 밝히지는 않았습니다. the source code에서 문제를 해결하려고 시도하거나 다른 모든 것이 실패 할 경우 Steve Ebersole에게 연락하여 변경을 구현하려고 시도 할 수 있습니까?

관련 문제