강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của lbd49464369
lbd49464369

câu hỏi đã được viết

Trong thực tế! Sử dụng Spring Boot và JPA1 - Phát triển ứng dụng Web

Tìm kiếm, hủy danh sách đơn hàng

@Transactional

Viết

·

384

1

안녕하세요 

강의 중 @Transactional 처리를 Repository에서 하신 적은 없으신데 저 같은 경우는 em.persist()만 하는데도 Repository에 @Taransactional이 필요하더라구요 없으면

cannot reliably process 'persist' call 와 같은 에러가 발생합니다.

제가 사용하는 코드 입니다.

@Transactional
@Override
public Long save(Member member) {
em.persist(member);
return member.getId();
}
// 아래 코드는 서비스 클래스 입니다
// 구글 사용자 정보가 업데이트 되었을 때를 대비하여 update 기능 구현(이름만 반영)
@Transactional
public Member saveOrUpdate(OAuthAttributes attributes) {
Member member = memberRepository.findByEmail(attributes.getEmail());
if (member == null) {
Long id = memberRepository.save(attributes.toEntity());
return memberRepository.findOne(id);
}
return member.update(attributes.getName());
}
웹앱JPAspring-bootspringjava

Câu trả lời 2

6

yh님의 프로필 이미지
yh
Người chia sẻ kiến thức

안녕하세요. lbd4946님

JPA의 모든 데이터 변경은 트랜잭션 안에서 발생해야 합니다. 따라서 트랜잭션이 없으면 데이터 변경에 실패합니다.

트랜잭션 애노테이션이 서비스에 있으면 해당 서비스의 메서드가 종료될 때 까지 모든 곳에 영향을 미칩니다. 

예를 들어서 서비스에서 리포지토리를 호출해도 서비스에서 시작한 트랜잭션은 계속 유지가 되면서 리포지토리를 사용합니다.

따라서 리포지토리에 꼭 트랜잭션 애노테이션이 없어도 됩니다.

도움이 되셨길 바래요^^

1

lbd49464369님의 프로필 이미지
lbd49464369
Người đặt câu hỏi

감사합니다!!!

Hình ảnh hồ sơ của lbd49464369
lbd49464369

câu hỏi đã được viết

Đặt câu hỏi