4

Hibernate 기반 트랜잭션 서비스 메서드를 통해 데이터를 전달할 때 DTO 사용을 피하는 진정한 실질적인 방법이 있습니까? 달리 말하면, DTO는 게으른 초기화 문제를 피하는 해커가 아닌 유일한 솔루션입니까?데이터 전송 개체 및 트랜잭션 서비스 메서드

  1. 열기 세션보기 패턴 :

    나는 DTO들에 대한 두 개의 인기있는 대안 내가 정말 그들처럼하지 않는 이유를 생각한다. 서비스 메소드를 진정으로 트랜잭션으로 유지하고 싶습니다 (즉, Hibernate 세션은 메소드가 종료 될 때 커밋되고 닫힙니다). 이는 나중에 예를 들어 웹 서비스로 서비스를 게시해야하는 경우 트랜잭션에 대해 걱정할 필요가 없기 때문에 주로 발생합니다.

  2. DTO 대신 서비스 메소드를 통해 전달하고 필요한 속성/등록 정보를 eager fetching합니다. 이것은 다소 나아졌습니다. 그러나 복잡한 엔티티 관계가있는 중요하지 않은 도메인 객체 계층에서 열망하는 가져 오기는 어딘가에서 중단되어야합니다. 그리고 그럴 때 엔, 이것이 엔티티를 어디에서나 참조하는 ID로 대체하는 완전한 해킹 턴으로 어떻게 빨리 변하지 않을지 나는 알 수 없습니다.

실제로 뭔가가 빠져 있거나 DTO입니까? 유지 관리의 관점에서 보면 단단한 접근 방식입니까?

답변

1

엔티티 종단 간을 실제로 사용하는 유일한 방법은 OpenSessionInView보다 조금 더 정교한 것을 사용하는 것입니다. 내 경험으로 당신은 응용 프로그램 수준에서 최대 절전 모드 세션을 수동으로 관리해야 할 것입니다. OpenSessionInView는 하나의 요청에 대해서만 동일한 세션을 제공합니다. 그 후에는 현재 세션에 지속적으로 다시 접속해야합니다. Seam과 대화를 보거나, 당신 자신의 Hibernate Session 관리를 구현하십시오.우리는 현재 마법사가 시작되고 끝날 때를 기반으로 세션을 수동으로 관리하고 Spring AOP를 사용하여 적절한 시간에 적절한 스레드에 세션을 연결합니다 (세션은 스레드 안전성이 아니며 AJAX와 잘 혼합되지 않습니다).

WebServices 손이 가장 확실하게 DTO의 어떤 형태를 필요로 할 것입니다. 나는 그 주위에 방법이 보이지 않는다. 엔티티는 POJO처럼 보일 수 있지만 실제로는 직렬화하지 않으면 불가능할 수도 있습니다. 서비스 메소드의 목표에 맞는 DTO를 작성하고 DTO를 완료하십시오.

개인적으로 필자는 DTO 패턴이 끔찍하다고 생각하지 않습니다. 웹 사이트를 만드는 것만으로 엔티티와 끝이가는 것이 가능하고 심지어 성능을 구매할 수도 있지만 더 유연 해지기를 원한다면 아키텍처, DTO 스틱

0

세션을 닫으라는 요구 사항을 완화해도 열린 세션을 계속 볼 수 있으며 서비스 트랜잭션의 모든 것을 커밋 할 수 있습니다. 세션은 여전히 ​​Lazy Fetch에서 사용할 수 있지만 모든 트랜잭션이 완료됩니다. 그러나 웹 서비스로 전환하려는 경우 어쨌든 모든 엔티티를 열심히로드해야합니다. DTO는 의식적으로 열심히 부하를 가하고 실수로 게으름을 막도록합니다.

두 가지 환경 모두에서주의해야한다면 DTO를 건너 뛸 수는 있지만, 필자는 실제로 열린 세션을 보면서 웹 서비스가 실제로 요구 될 때 걱정할 것입니다.

+0

세션을 열어두면 합리적인 것처럼 보인다. 웹 서비스와 까다로운 부분은 엔티티 객체 트리가 깊은 경우, 몇 가지 (나중에 조회 할) 리거나 참조 식별자로 대체해야한다는 것입니다. 일단 이렇게하면 DTO가 서비스 외부에 형성 되더라도 기본적으로 DTO를 갖게됩니다. –

1

저장소, 서비스 및 컨트롤러는 응용 프로그램 핵심을 다루는 장소 여야합니다 (원하는 경우 Hibernate Session은 확실히 저장소 계층의 전체로 사용할 수 있습니다).

조회수는 애플리케이션 코어, 도메인 모델을 처리하지 않아야합니다. 그들은 살아있는 물체를 다루지 않아야하지만 살아있는 물체를 생생하고 맞춤형으로 표현해서는 안됩니다. 뷰는 필요로하는 특정 형식으로 필요한 데이터 만 전달해야합니다. 뷰에 대한 DTO를 빌드해야합니다. 이 패턴은 도메인 모델과 대비되는 뷰 모델이라고도합니다.

여러분의 삶을 편하게하려면 도메인 모델 개체에서보기 모델 개체로 자동 매핑하고 다시 매핑 할 수있는 라이브러리 또는 프레임 워크가있을 수 있습니다. .NET에는 현재 개발중인 AutoMapper라는 오픈 소스 프레임 워크가 있습니다. Java가 무엇인지 확신 할 수 없습니다.

+1

나는 도저는 DTO들 /에서 자바 도메인 객체의 자동 매핑을 실시 생각하지만, 내가 직접 사용한 적이 없으니까. –

관련 문제