Wicket + Spring + Hibernate를 사용하는 3계층 애플리케이션입니다.거래를 어떻게 처리하시겠습니까?

StackOverflow https://stackoverflow.com/questions/531451

문제

사용할까 생각중이에요 보기에서 세션 열기(OSIV) Spring과 함께 제공되는 필터 또는 인터셉터는 개발자로서 나에게 편리한 방법인 것 같습니다.그것이 당신이 권장하는 것이라면 필터나 인터셉터를 사용하는 것이 좋습니다. 그리고 그 이유는 무엇입니까?

또 어떻게 섞일지 궁금하네요 최대 절전 모드 템플릿 메소드를 다음으로 표시하는 기능을 잃게 된다면 @Transactional(readOnly = true) 등으로 인해 좀 더 세분화된 트랜잭션 제어 기능을 상실하게 됩니까?

Hibernate와 Spring을 사용하여 이러한 종류의 솔루션을 3계층 아키텍처와 통합하는 방법에 대한 모범 사례가 있습니까? (제 생각에 Wicket을 프리젠테이션에 사용하기로 한 결정은 그다지 중요하지 않을 것입니다.)

OSIV를 사용하면 최소한 지연 로딩 예외가 발생하지 않을 것입니다. 반면에 내 트랜잭션은 뷰에서도 커밋 해제되어 커밋할 수 있기 전에 더 오래 지속됩니다.

도움이 되었습니까?

해결책

정말 개인적인 취향의 문제입니다.

개인적으로 나는 서비스 계층에서 트랜잭션 경계를 갖는 것을 좋아합니다.SOA를 생각하기 시작했다면 서비스에 대한 모든 호출은 독립적이어야 합니다.뷰 레이어가 2개의 다른 서비스를 호출해야 하는 경우(이미 코드 냄새라고 주장할 수 있음) 해당 2개의 서비스는 서로 독립적으로 작동해야 하며 다른 트랜잭션 구성을 가질 수 있습니다.서비스 외부에 열려 있는 트랜잭션이 없으면 서비스 외부에서 수정이 발생하지 않도록 하는 데도 도움이 됩니다.

OTOH 서비스에서 수행하는 작업(지연 로딩, 공통 트랜잭션이 필요한 경우 동일한 서비스 방법으로 기능 그룹화 등)에 대해 좀 더 생각해야 합니다.

지연 로딩 오류를 줄이는 데 도움이 될 수 있는 패턴 중 하나는 서비스 계층 외부에서 값 개체를 사용하는 것입니다.서비스는 항상 필요한 모든 데이터를 로드하고 이를 VO에 복사해야 합니다.영구 객체와 뷰 레이어 간의 직접적인 매핑을 잃게 되지만(즉, 더 많은 코드를 작성해야 함) 명확성을 얻을 수 있습니다.

편집하다: 결정은 트레이드 오프에 기초할 것이므로 적어도 부분적으로는 개인적인 취향의 문제라고 생각합니다.서비스 계층에서의 트랜잭션은 더 깔끔한 느낌입니다(SOA에 더 가깝고 논리가 서비스 계층에 명확하게 제한되어 있으며 다양한 호출이 명확하게 분리되어 있습니다...).이 접근 방식의 문제점은 LazyLoadingExceptions이며 이는 VO를 사용하여 해결할 수 있습니다.VO가 단지 영속 객체의 복사본이라면 그렇습니다. 이는 분명히 DRY 원칙을 위반하는 것입니다.데이터베이스 뷰를 사용하는 것처럼 VO를 사용한다면 VO는 영속 객체를 단순화한 것입니다.작성해야 할 코드는 여전히 더 많지만 디자인이 더 명확해집니다.일부 인증 체계를 연결해야 하는 경우 특히 유용합니다.특정 필드가 특정 역할에게만 표시되는 경우 인증을 서비스 수준에 두고 표시해서는 안 되는 데이터를 반환하지 않을 수 있습니다.

다른 팁

내가 OSIV를 사용한다면 적어도 게으른 로딩 예외에 들어 가지 않을 것입니다.

사실은 사실이 아닙니다. 실제로 악명 높은 LazyInitializationException에 들어가기가 매우 쉽습니다. 객체를로드하고 구성에 따라 뷰 후에 속성을 읽으십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top