이번에는 엔티티 간의 상속 관계의 디자인 인 최대 절전 모드의 계층 적 디자인에 대해 이야기합시다.
어쩌면 이것은 더 추상적 일 것입니다. 예제를 직접 살펴 보겠습니다.
1) 먼저 공통 연습을보고 코드를 직접 입력합시다. 세 가지 실제 클래스는 다음과 같습니다.
공개 클래스 Titem은 직렬화 가능 {// get/set method private int id; 개인 문자열 제조; 개인 문자열 이름; } public class tbook 확장 titem {// get/set method private int pagecount; } public class tdvd는 titem을 확장합니다. {// get/set method private String greatCode; }
여기에는 세 가지 매핑 파일이 필요하며 내용은 다음과 같습니다.
<class name = "titem"table = "item"> <id name = "id"column = "id"type = "java.lang.integer"> <generator/> </id> <property name = "name"column = "name"type = "java.lang.string"/> <property name = "manufacture"column = "manufaction" "java.lang.lang.lang.String"/>>>. 테이블 = "book"> <id name = "id"column = "id"type = "java.lang.integer"> <generator/> </id> <property name = "name"column = "name"type = "java.lang.string"/> <Property name = "manufacture"column = "manufacture" "java.lang.string"/> <property name = "pagecount" type = "java.lang.integer"/> </class> <class name = "tdvd"table = "dvd"> <id name = "id"column = "id"type = "java.lang.integer"> <generator/> </id> <속성 이름 = "name"= "type" "java.lang.string"/> <property name = "java.lang.string. type = "java.lang.string"/> <property name = "regioncode"열 = "regioncode"type = "java.lang.string"/> </class>
매우 일반적인 매핑 파일, 이전 매핑 파일과는 차이가 없습니다.
테스트 방법을 직접 작성합시다.
public void testselect () {query query = session.createquery ( "titem에서"); 목록 List = Query.list (); 반복자 iter = list.iterator (); while (iter.hasnext ()) {system.out.println ( "name :"+(((titem) iter.next ())). getName ());}} 여기서 우리는 특정 단어 클래스가 아니라 Titem 클래스를 사용하고 있습니다. 여기에서는 Titem 클래스에서 상속 된 서브 클래스를 자동으로 찾아 모든 결과를 찾습니다. 여기에는 다형성이 포함됩니다. 클래스 태그에는 속성 다형성이 있으며 기본값은 암시 적이므로 이름을 지정하지 않고 결과를 쿼리 할 수 있습니다. 명백한 경우이 유형의 결과를 찾기 전에 특정 클래스 이름을 지정해야한다는 의미입니다.
2) 이전 예에서는 3 개의 매핑 파일을 사용했습니다. 수정해야 할 때는 대규모 프로젝트에서는 불가능한 3 개의 매핑 파일을 수정해야합니다. 또한, 각 테이블에는 해당 메인 클래스에 해당하는 필드가 있으며 이는 중복됩니다. 그래서 우리는 다음과 같은 방법을 가지고 있습니다.
엔티티 클래스는 여전히 1)과 동일합니다. 매핑 파일을 3 대 1로 변경하고 Titem 매핑 파일 만 유지합니다. 그러나 해당 수정을해야하며 컨텐츠는 이제 다음과 같습니다.
<class name = "titem"table = "item"polymorphism = "explicit"> <id name = "id"column = "id"indine = "java.lang.integer"> <generator/> </id> <property name = "namecul ="name "column ="java.lang.string "/> <spoction namecture"java.lang ""java.lang "/> <joined-subclass name = "tbook"table = "tbook"> <key column = "id" /> <property name = "pagecount"column = "pagecount"type = "java.lang.integer" /> < /joined-subclass> <joined-subclass name = "tdvd"table = "tdvd"> <head " />>>>>>>>>>>>> code". column = "regioncode"type = "java.lang.string"/> </joined-subclass> </class>
여기에는 매핑 파일 만 있지만 결합 서브 클래스 태그가 있습니다.이 클래스는 현재 클래스에서 상속 받음을 나타냅니다. <key>는 하위 테이블의 기본 키를 나타냅니다. 여기에서 하위 테이블은 하위 클래스, TBook 및 TDVD에 해당하는 두 테이블을 나타냅니다. 하위 테이블의 필드만이 속성에 지정되어 있습니다.
이런 식으로, 우리가 실행 한 후 생성 된 테이블은 다음과 같습니다.
두 서브 클래스에 해당하는 테이블은 속성을 통해 우리가 지정한 필드 일뿐입니다. 이렇게하면 테이블의 여러 필드를 피하기 때문에 단어 테이블은 별도의 필드 만 유지합니다. 항목 클래스가 변경되면 너무 많은 수정을 할 필요가 없습니다.
3) 깃발을 테이블에 넣음으로써 달성되는 계층 적 설계를 구현하는 다른 방법에 대해 알아 보겠습니다. 최대 절전 모드 매핑 파일에서 Descriminator 태그를 통해이를 구현합니다.
더 이상 고민하지 않고 예를 살펴 보겠습니다.
우리는 어제 titem의 매핑 파일을 다음과 같이 수정했습니다.
<class name = "titem"table = "item"polymorphism = "expricit"> <id name = "id"column = "id"indine = "java.lang.integer"> <generator/> </id> <판별기 열 = "categor"java.lang.string "/> <property name ="name ""type ""java.lang ""java.lang ""java.lang ""java.lang ". 이름 = "제조"열 = "제조"유형 = "java.lang.string"/> </class>
가운데를보고, 우리는 두 개의 서브 클래스가 어떤 필드를 구별하는지를 보여주는 판별 기 태그를 추가했습니다.
<서브 클래스 이름 = "tbook"Distriminator-value = "1"> <속성 이름 = "pagecount"column = "pagecount"/> </subclass> <subclass name = "tdvd"Distriminator-value = "2">
우리는이 두 단락을 봅니다.이 단락은 판별자가 지정된 필드의 값이 1 일 때 TBook 클래스이고 PageCount의 값이 있음을 나타냅니다. 판별자가 지정된 필드의 값이 2 인 경우, TDVD 클래스이고 RegionCode에 값이 있음을 나타냅니다.
이런 식으로, 우리는 하나의 테이블 만 사용하면 그들과 여러 클래스의 관계를 나타냅니다. 이 방법은 너무 많은 서브 클래스에 좋지 않습니다. 메인 테이블에서 너무 많은 필드를 유발하고 특정 설계 불편 함을 유발합니다.