2012-07-09 4 views
3

데이터베이스에 "국가 /도/도시"와 같은 열이 있습니다 (예 : "캐나다/온타리오/토론토". 나는 이것을 분리하여 3 개의 별도의 Java Bean 속성으로 매핑해야합니다.빈혈 영역 회피

나는 이것을하기에 가장 좋은 곳이 궁금합니다.

(1) DAO 행이 검색되는 것처럼 세터가 (3)이 SQL 함수는 질의의 행을 파싱이라고 게터는 (2) 도메인 (빈) (4)를 사용하여 ResultSetExtractor

"빈혈 도메인"방지 패턴이 빈이 적절한 장소임을 나타 내기 때문에 # 2 또는 # 4쪽으로 향하고 있습니다.

+0

"DAO"란 무엇인가요? – Gabe

+0

@Gabe 데이터 액세스 개체. 비즈니스 소프트웨어의 세계에서 사용되는 표준 패턴. –

답변

1

IMHO, 가장 적합한 곳은 데이터베이스입니다. 이 열을 표의 3 열로 나누고 한 정보를 열별로 저장합니다.

레거시 이유로 실제로이 옵션을 사용할 수 없다면 실제로 도메인 개체에서 직접 수행 할 것입니다. 이것은 다른 개체에 영향을주지 않고 도메인 개체에 직접 캡슐화 될 수있는 동작입니다.

+0

DB를 피하고자하는 이유는 구분 된 경로 항목이 더 많거나 적은 노드를 포함하도록 변경 될 수 있으며 적응할 수있는 유연성을 원하기 때문입니다.즉 두 번째 노드는 적어도 어떤 경우에는 지방이 아니기 때문에 논리를 적용해야 할 수도 있습니다. 더 많이 보게되면서, 나는 ResultSetExtractor (Spring JDBC)를 사용하는 것을 좋아한다. 그것은 콩이 아니며, DAO가 아닙니다. 그것은 두 사람의 중간에 앉는다. – EdgeCase

+0

경로가 복잡해질수록 정규화 된 데이터 모델 인 IMHO가 더 필요합니다. 그렇지 않으면 XML, JSON 또는 직렬화 된 객체를 단일 열에 저장하게되고 더 이상 데이터를 쿼리 할 수 ​​없게됩니다. 하나의 열 = 하나의 정보. –

+0

DB를 재 설계하는 옵션이 아직 OP에 열려있는 경우 ** 분명히 ** 선호해야합니다. 잘 구조화 된 모델을 갖는 장점을 능가 할 수있는 것은 없습니다. 우리는 다른 옵션에 대해서만 논의해야한다고 생각합니다. –

2

나는 당신과 동의 할 지 모르겠다. 도메인 엔터티가 데이터 표현의 영향을받을 필요가 없다고 주장 할 수 있습니다.
데이터베이스 레이아웃이 다른 경우 setter 및 getters가있는 bean을 가지고 있다고 생각하십니까?
답변이 '아니오'인 경우 아마 그 옵션을 원하지 않을 것입니다.

개인적으로 데이터 액세스 계층이 있으면 데이터 표현을 도메인 표현으로 바꾸는 것이 작업의 일부라고 개인적으로 생각합니다.

+0

반 패턴으로서의 빈혈 영역의 자격은 현실에 미치지 못했습니다. 비즈니스 소프트웨어에서는 실제로 함수와 데이터 모델의 완전한 분리가 필요합니다. OOP는 비즈니스 로직에 제공 할 것이 많지 않습니다. 사실, 각 함수가 객체에 전달되도록 요구함으로써 객체 그래프가 거대하고 유지 불가능한 객체 그래프를 만들어내는 경향이 있습니다. IoC 프레임 워크를 autowiring하기 위해 그래프 빌딩을 강등시키지 않고 빌드하려고 시도하는 사람조차 없습니다. –

+0

다시 한번 귀하의 의견을 사실로 말하고 있습니다. –

+0

+1 DAO가이 번역을 수행 할 수있는 최적의 장소입니다. 도메인 객체는 퍼시스턴스 모델이 아닌 실제 비즈니스 모델을 반영해야합니다 (많은 경우 기존의 이유로 인한 것입니다). – casablanca

0

이것이 JPA @Entity 인 경우 개인 문자열을 DB 열에 직접 매핑 한 다음 공개 getters로 액세스를 래핑합니다. 이렇게하면 도메인 모델의 소비자가 연결된 문자열의 내부/DB 표현과 분리됩니다. 또는 @PostLoad 콜백으로 번역을 수행 할 수도 있습니다. (역 변환은 계속 @PrePersist 콜백에서 수행 할 수 있습니다.)

0

실제로 동일한 솔루션이 아닌가요? DAO 코드 안에 ResultSetExtractor을 사용한다고 가정합니다. SQL 함수를 사용하는 것은 다른 기술에서 재사용 할 수 있기 때문에 나쁜 생각은 아니지만 유지 관리 문제가 있습니다.

퍼포먼스 측면에서 좋지 않아서 파싱을 지연하는 것을 권장하지 않으며, 해당 필드로 다른 작업을 수행 할 때 인생을 복잡하게 만들 수 있습니다. 콩이 이미 세 개의 필드를 가지고 있다면 더 깨끗합니다.

+0

예, DAO 및 추출기가 같은 클래스에 있었지만 분리했습니다 - 올바르게 또는 잘못되었습니다. 위의 질문에 대한 제 응답을 참조하십시오. – EdgeCase