방금 Spring-data, Hibernate, MySQL, JPA 프로젝트 작업을 시작했습니다. 수동으로 쿼리를 만드는 것에 대해 걱정할 필요가 없도록 스프링 데이터로 전환했습니다.
@Transactional
주석없이 내 쿼리를 시도했기 때문에 스프링 데이터를 사용할 때 의 사용이 필요하지 않다는 것을 알았습니다 .
@Transactional
주석을 사용하거나 사용하지 않아야하는 특별한 이유가 있습니까?
공장:
@Transactional
public List listStudentsBySchool(long id) {
return repository.findByClasses_School_Id(id);
}
또한 작동합니다 :
public List listStudentsBySchool(long id) {
return repository.findByClasses_School_Id(id);
}
미리 감사드립니다!
답변
실제로 질문은 무엇입니까? 의 사용법 @Repository
주석 또는 @Transactional
.
@Repository
선언 한 인터페이스는 스프링 데이터 인프라가 생성하고 어쨌든 예외 번역을 활성화하는 프록시에 의해 지원되므로 전혀 필요하지 않습니다. 따라서 SpringData 저장소 인터페이스에서이 주석을 사용하는 것은 전혀 효과가 없습니다.
@Transactional
-JPA 모듈의 경우 프록시 ( SimpleJpaRepository
)를 지원하는 구현 클래스에이 주석이 있습니다. 그 이유는 두 가지입니다. 첫째, 객체를 유지하고 삭제하려면 JPA에서 트랜잭션이 필요합니다. 따라서 트랜잭션이 실행 중인지 확인해야합니다.이 작업은 메서드에 @Transactional
.
같은 방법을 읽기 findAll()
및 findOne(…)
사용 @Transactional(readOnly = true)
을 엄격히 필요는 없지만 트랜잭션 인프라에 몇 가지 최적화를 트리거하는합니다 (이 설정 FlushMode
을 MANUAL
을 닫을 때 공급자가 잠재적으로 오염 검사를 건너 뛰 지속성 수 있도록 EntityManager
). 그 외에도 플래그가 JDBC 연결에 설정되어 해당 수준에서 추가 최적화가 발생합니다.
사용하는 데이터베이스에 따라 테이블 잠금을 생략하거나 실수로 트리거 할 수있는 쓰기 작업을 거부 할 수도 있습니다. 따라서 @Transactional(readOnly = true)
리포지토리 인터페이스에 해당 주석을 쉽게 추가 할 수있는 쿼리 메서드도 사용 하는 것이 좋습니다 . @Transactional
해당 인터페이스에서 선언하거나 다시 장식했을 수있는 조작 메서드에 일반 을 추가해야합니다 .
답변
나는 질문이 조금 더 넓고 데이터 액세스 레이어의 주석에서 줄일 수 없다고 생각합니다. 애플리케이션의 전체 스택, 적용하려는 트랜잭션 전략 등을 고려해야합니다. IBM developerworks 사이트에 Mark Richards가이 주제에 대한 매우 포괄적 인 기사 세트가 있습니다. 첫 번째는 https://developer.ibm.com/articles/j-ts1/ 에서 찾을 수 있습니다.
친애하는
답변
@Repository
주석을 사용해야합니다.
이것은 @Repository
확인되지 않은 SQL 예외를 Spring Excpetion으로 변환하는 데 사용되며 처리해야하는 유일한 예외는DataAccessException
답변
또한 @Transactional 주석을 사용하여 다른 스레드 / 요청이 읽기를 변경하지 않도록 레코드를 잠급니다.