안드레이 치오 바누 :
내가 뭔가를 놓친 거지 확신합니다,하지만 난 정확히 모르겠어요 ...
다음 코드주기 :
@Service
public class MyClass {
private MyClass self;
private UserRepository userRepository;
private ApplicationContext applicationContext;
@PostConstruct
private void init() {
self = applicationContext.getBean(MyClass.class);
}
@Transactional
public void doA(User user) {
...
if (condition) {
self.doB(user);
throw new SecurityException();
}
user.setRandomField("x");
userRepository.save(user);
}
@Transactional(value = Transactional.TxType.REQUIRES_NEW)
public void doB(User user) {
...
userRepository.save(user);
}
}
나는 무엇에 대해 알고 @Transactional
그것을 사용하는 경우, 전화를 중복 때문이다 repository.save(entity)
.
내가 뭘하려고 오전, 트랜잭션 방법에서 개체를 처리하는 것이며, 파괴 조건이있는 경우, (주석 새로운 메소드를 호출 REQUIRES_NEW
엔티티의 일부 필드를 업데이트하고 저장합니다). 루트 방법 ( doA
)는 예외를 던진다. 참고로 다음은 @Transactional(dontRollbackOn = SecurityException.class)
이 상황에서 옵션을 선택하지 않습니다.
하나의 방법으로 새로운 빈을이 커밋 메커니즘을 사용하는 대신 작성을 위해 난 그냥 단지라는 변수에 현재 빈을 주입 self
그러므로 내가 트랜잭션 관리를위한 빈 프록시를 사용할 수 있습니다.
이상한 것은 내가에서 제거 나는 경우이다 전화, 트랜잭션이 때문에의 롤백 할됩니다 에 의해 수행 된 변경 사항이 아니라 롤백 할 수 있습니다. 내가 거기에서 그것을 할 경우 예상하지만,이 노력하고 있습니다.doB
save
doA
SecurityException
doB
내가 뭔가 잘못하고있는 중이 아니면 내가 뭔가를 놓친 거지?
감사!
StanislavL :
DOB의 사용자 인스턴스를 통과하지보십시오 (). 대신 ID를 전달하고 내부의 repo에서 사용자를 참조하십시오. 나는 첨부 된 개체가 다른 세션 사이에 처리하는 방법을 모르겠습니다.