2016-07-25 2 views
4

사양에서 다음 정보를 찾았습니다. 그러나 영어 원어민이 아닌 사람은 나를 위해 충분하지 않습니다. 엔티티 영속화 또는 제거 된 후@PostRemove가 트랜잭션에서 벗어 났습니까?

PostPersistPostRemove 콜백 방법은 개체에 대해 호출된다. 이러한 콜백은 이러한 작업이 계단식으로 연결된 모든 엔터티에서 호출됩니다. PostPersistPostRemove 메서드는 데이터베이스 삽입 및 삭제 작업 후에 각각 호출됩니다. 이러한 데이터베이스 작업은 지속, 병합 또는 제거 작업이 호출 된 직후에 수행되거나 플러시 작업이 발생한 직후에 발생할 수 있습니다 (트랜잭션이 끝난 시점 일 수 있음). 생성 된 기본 키 값은 PostPersist 메서드에서 사용할 수 있습니다.

제 질문은 @PostRemove 후에 트랜잭션 관련 작업을 롤백 할 수 있습니까?

는 이러한 오프라인 파일이 저장에서 삭제하고 기업은 여전히 ​​데이터베이스에 남아 가능한가요의 내 엔티티가 @PostRemove

class MyEntity { 

    @PostRemove 
    private void onPostRemove() { 
     // delete offline files related to this entity 
     // not restorable! 
    } 
} 

일부 오프라인 파일을 삭제한다고 가정 해 봅시다? (롤백으로)

+0

관련 항목 : http://stackoverflow.com/questions/4895854/jpa-postpersist-postupdate-transaction?rq=1 – MWiesner

답변

3

예, 롤백 후 파일이 삭제되고 사용자의 엔터티가 여전히 db에 남아있을 수 있습니다. @PostRemove은 거래에서 입니다.

트랜잭션이 성공적으로 완료된 경우에만 파일이 삭제된다는 것을 확실하게 알고 싶다면 commit()이 콜백 메소드를 사용하지 않고 파일을 삭제해야합니다. 그러나 파일이 삭제 된 경우에만 엔티티가 제거되었는지 확인해야하는 경우 문제가있는 것입니다. 트랜잭션 방식으로 파일 시스템에 액세스해야합니다.

간단한 해결책은 db- 거래 중에 파일을 to_be_deleted -folder로 이동시키는 것입니다. 따라서 콜백 메소드를 사용할 수 있습니다. 파일은 commit()이 성공하면 실패하고 실패하면 복원됩니다.

좀 더 자세히 설명하고 응용 프로그램이 java EE 컨테이너에서 실행되는 경우 CDI events 또는 jca adapter을보고 싶을 수 있습니다. Spring을 사용하고 있다면 TransactionSynchronizationAdapter을 등록 할 수 있습니다. this answer을 참조하십시오.

1

에 달려 있습니다.

여러 번의 플러시 (EntityManager#flush())를 사용하는 경우에도 트랜잭션을 롤백 할 수 있습니다. 그렇지 않으면 접두사가 Post 인 접두사가 데이터베이스 트랜잭션이 완료된 후에 실행됩니다.

+0

'PreXXX' - 콜백을 사용하는 것은 의미가 없습니다. 트랜잭션이 실패 할 수있는 시점에 파일이 삭제됩니다. – frifle

+0

네 말이 맞아. 특정 사용 사례에 충분한주의를 기울이지 않았습니다. 업데이트 됨. – fny

관련 문제