2011-10-04 3 views
2

나는 독자적으로 배우려고했지만 끝이없는 책이 끝날 때까지 최상위 레벨을 이해하지 않고 모든 @Entity 등의 저급 물건을 알게되었습니다.지속 디자인 일반 질문


그래서 내 이해입니다 : 우리는 보통 우리가 도메인 모델에 수행 할 수있는 모든 방법을 정의 DAO 인터페이스를 선언

  1. .
  2. 두 번째로 Domain Model을 작성하여 데이터베이스의 엔터티를 나타냅니다.
  3. Hibernate, JPA, JDBC 또는 우리가 가지고있는 기적과 DAO 인터페이스를 구현할 수있는 DAO 구현 클래스를 작성합니다.


    우리는 도메인 모델 당 하나의 DAO 인터페이스를 쓰기 :


내 질문 은 위의 포인트를 참조 (Spring에 모두 최대 배선)? 참여가 하나 이상의 도메인 모델을 포함하는 크로스 커팅 (cross-cuting) 동작을하는 경우 새로운 쌍 DAO 인터페이스 구현을 선언하고 그에 따라 호출합니다. 예 : "Stock에서 고객 주문, Stock에서 Item 사용 가능 여부를 확인 ->"어디로 갈 것입니까? "


최대 절전 모드 MVC와 상호 작용하는 방법은 무엇입니까? 알고 있어야 할 중요한 측면이 있습니까? 내가 눈치 책에서

:. 간단한 시나리오에서

재정이 같음와 hashCode

는 "Hibernate는 경우, 그러나 도메인 개체 자체에 특별한 변경없이 엔티티 동등성을 유지 할 수 있습니다 응용 프로그램에서 java.util.Set과 같은 Java 콜렉션에 엔티티를 추가해야하거나 분리 된 엔티티로 작업 할 계획이라면 도메인 객체의 기본 equals() 및 hashCode() 메소드를 대체해야합니다. "

어쩌면 저는 그것을 정말로 잘 이해하지 못한다. 분리 된 존재는 무엇인가? 그것들은 우리가 Hibernate 문맥에서 가져온 것인가? 사실상 클래스 모음 일까?

내가 원한 것은 그 작업을 최대 절전 모드로 안전하게 수행 한 다음 Servlet에 제공 할 Model을 리턴하고 적절한 View로 위임 할 모델이다. DAOimpl 클래스 메소드에서 간단한 리턴으로 모델을 추출하거나 다소 까다 롭습니다.


ORM 프레임 워크를 사용하지 않고 지속성 계층을 수행하려면 일반 JDBC를 사용해야하며 내 문제점은 무엇입니까? 나는 Hibernate가 동시 요청을 처리하는 똑똑한 세션을 가지고 있다고 들었다. 그래서 JDBC로 어떤 일이 일어날 것인가?


비즈니스 로직은 어디에 있습니까? DAOimpl 클래스입니까?


내 질문 중 일부가 잘못되어 불편을 끼쳐 드려 죄송합니다. 비평과 수정에 감사드립니다.

감사합니다.

답변

2

도메인 모델 당 하나의 DAO 인터페이스를 작성합니까? 우리가 크로스 커팅 행동을 하나 이상의 참여가있는 경우 도메인 모델 우리는 새로운 쌍 DAO 인터페이스 구현을 선언하고 이에 따라 을 호출합니까? 예를 들어, "재고에서 고객 주문, 재고 확인 항목을 사용할 수 있는지 여부 ->"어디로 갈 것입니까? "

그렇게 할 수 있습니다. 좀 더 간단한 방법은 서비스가 DAO 호출을 관리하도록하는 것입니다. Spring을 사용하면 서비스 메소드에서 트랜잭션 경계를 정의 할 수 있으므로 모든 DAO 메소드가 동일한 트랜잭션에 참여하게됩니다. 따라서 DAO는 각각의 모델에 대해 고유하게 유지되며 이론 상으로는 더 간단합니다. DAO가 세션을 플러시 할 때 모두 변경 사항이 데이터베이스로 푸시됩니다. 따라서 User 모델과 Profile 모델이 있고 최대 절전 모드에서 적절하게 매핑 된 경우 각각의 인스턴스를 만들고 세션 플러시를 호출하면 둘 다 저장됩니다.

DAO는 하나의 작업, 즉 지속성 작업을 수행해야하기 때문에이 방법이 매력적입니다. 복잡한 DAO를 만들기 시작하면, 원하지 않는 퍼시스턴스 계층에 앱의 비즈니스 요구 사항을 요약 할 수 있습니다. 서비스는 비즈니스 요구 사항을 구현하기 위해 지속성 작업을 주문할 수있는 장소입니다.

최대 절전 모드는 MVC와 상호 작용하는 방법? 에 대해 알아야 할 중요한 측면이 있습니까?

MVC는 패러다임이다. 모델보기 컨트롤러. 응용 프로그램에서 명확한 관심사를 정의하여 개별 구성 요소에 집중할 수 있도록하는 것이 목적입니다. 예를 들어, Model 객체는 자신에게 렌더링하는 방법을 뷰에 알리지 않아야합니다. Hibernate는 ORM 영속성 구현이다. 최대 절전 모드 코드는 모델 개체를 저장하는 한 가지 방법입니다. MVC와 최대 절전 모드는 서로 거의 관련이 없으며, 응용 프로그램과 절전 모드에서 MVC를 가질 수 있으며, 응용 프로그램과 MVC에서 최대 절전 모드를 가질 수 있습니다.

어쩌면 나는 그것을 잘 이해하지 못한다. 분리 된 개체는 무엇일까요? 우리가 Hibernate 문맥에서 가져온 것인가? 그냥 클래스 모음인가?

documentation "분리 - 분리 된 인스턴스는 지속되었지만 세션이 닫힌 개체입니다."

분리 된 인스턴스는 나중에 저장할 수 있지만 세션과 다시 연결해야합니다.

ORM 프레임 워크없이 지속성 계층을 수행하려면 일반 JDBC 만 사용하면됩니다. 내 문제는 무엇입니까? 나는 Hibernate가 동시 요청을 처리하는 똑똑한 세션을 가지고 있다고 들었다. 따라서 JDBC로 어떻게 될까?

주된 단점은 응용 프로그램에서 개체를 나타내는 데 객체를 사용하는 경우 jdbc 결과를 객체로 변환해야한다는 것입니다. 당신은 또한 SQL을 작성해야합니다. jdbc를 사용하는 것은 나쁜 생각이 아닙니다. ORM은 옵션입니다. JDBC가 또 다른 옵션입니다. 혼합하고 일치시킬 수도 있지만 복잡 할 수 있습니다. 애플리케이션에 대한 동시 요청은 지속성 계층의 관심사가 아니어야합니다. DAO가 상태를 저장하지 않도록 (즉, 정적 변수 사용) 확인해야합니다.

비즈니스 로직은 어디에 있습니까? DAOimpl 클래스입니까?

도메인 모델과 서비스의 조합입니다. 이미 언급 한 바와 같이, 물건을 순서대로 저장해야하는 경우 서비스에 들어갈 수 있습니다. 일부 필드를 일부 값으로 제한해야한다는 요구 사항이 있으면 모델 자체에있을 수 있습니다. 그것은 DAO가 아닙니다. 그것들은 단지 지속성을 처리해야합니다.

+0

대단히 고맙습니다.이 객체를 인스턴스로보기에 모델로 전달할 수 있습니까? Cat fritz = (Cat) sess.load (Cat.class, generatedId); – Aubergine

+0

@aubergine – hvgotcodes

+0

:-) 나는 단지 Hibernate Session에서 엔티티를 간단한 클래스 인스턴스로 가져 오는 방법을 구체적으로 물어 보았다. Cat fritz = (Cat) sess.load (Cat.class, generatedId); 고양이 프리츠 (Cat fritz)는 영구적이지 않고 서비스 용으로 사용될 수 있으며 모델로 사용됩니까? 죄송합니다 :-) – Aubergine

1

스프링/하이버 네이트 웹 앱에서 DAO 레이어를 제거했습니다. 불필요한 것처럼 보였습니다. 사실 나는 그들이 지금 무엇으로 구성 될지 상상할 수 없습니다. 하지만 이것은 somewhatdebatable입니다.

최대 절전 모드로 equals와 hashcode를 대체하기 위해 일반적으로 db 생성 된 자동 ID를 사용합니다. 다시 다소 다소 debatable입니다. id가 db에 처음 지속 된 후에 만 ​​존재한다는 것을 알고있는 한 문제는 없습니다.

비즈니스 로직은 어디에 있습니까?

도메인 개체/최대 절전 엔터티 - this의 도메인 이름은 controversial입니다.