1. 수집 매핑
1. 컬렉션 소개
컬렉션 매핑은 또한 기본 매핑이지만 개발 프로세스 중에 자주 사용되지 않으므로 깊은 이해가 필요하지 않습니다. 기본 사용 방법 만 이해하면됩니다. 개발 과정에서 그러한 문제가 발생할 때 솔루션을 쿼리 할 수 있습니다. 해당 세트 매핑 실제로 Java의 세트를 해당 테이블에 매핑하는 것을 나타냅니다. 수집 객체의 매핑입니다. Java에는 세트, 맵, 목록 및 일반 배열의 네 가지 유형이 있습니다. 그들 사이에는 큰 차이가 있습니다.
(1) 중복 객체가 없어야하며, 물체는 무질서합니다.
(2) 반복 된 물체로 목록을 주문할 수 있습니다.
(3) 맵은 주요 값 쌍으로 나타납니다.
(4) 배열을 반복 할 수 있으며 객체 사이에 순서가 있습니다.
이들의 차이는 개발 중에 사용되는 컬렉션을 결정합니다. 일반적으로 세트는 개발 중에 사용됩니다. 그 내부의 객체는 불필요하며 반복기를 사용하여 내부 객체를 얻을 수 있습니다. 이 세트가 해당 관계형 모델에 매핑하려면 Hibernate, <set>, <list>, <map> 및 <어레이>가 제공하는 매핑 태그를 사용해야합니다.
2. 매핑 소개
세트 매핑의 관계 모델에 대해 계속 논의하십시오. 세트 매핑은 다른 객체 컬렉션에 해당하는 객체를 나타냅니다. 저장시 Hibernate는 데이터 세트를 해당 테이블에 저장하고 할당 된 ID에 따라 데이터 테이블에 데이터를 저장합니다. 새 테이블이 세트에 별도로 할당되면 ID는 세트 테이블의 ID에 할당되고 해당 관계 테이블은 다음과 같습니다.
3. 클래스 파일
코드를 통해 세트 매핑이 구현되는 방법은 다음에 자세히 분석 할 것입니다. 여기서 우리는 모든 컬렉션을 수업으로 밀봉합니다. 우리는이 클래스 CollectionMapping.java라고 부르므로 해당 내부 코드는 다음과 같습니다.
패키지 com.hibernate; Java.util.list 가져 오기; java.util.map import; java.util.set import; @suppresswarnings ( "rawtypes") public class collectionmapping {// id private int id; public int getid () {return id; } public void setid (int id) {this.id = id; } // 이름 개인 문자열 이름; 공개 문자열 getName () {return name; } public void setName (문자열 이름) {this.name = 이름; } // 세트 수집 개인 세트 setValues; public set getSetValues () {return setValues; } public void setsetValues (set setValues) {this.setValues = setValues; } // 목록 수집 개인 목록 ListValues; 공개 목록 getListValues () {return listValues; } public void setListValues (list listValues) {this.listValues = listValues; } // Array Collection private String [] arrayValues; public String [] getArrayValues () {return arrayValues; } public void setArrayValues (String [] arrayValues) {this.arrayValues = arrayValues; } // 맵 컬렉션 개인지도지도 values; 공개 맵 getMapValues () {return mapValues; } public void setMapValues (map mapValues) {this.mapvalues = mapValues; }}이 클래스는 일반적으로 사용되는 여러 세트를 캡슐화합니다. 관계형 모델로 변환하려면 아래 매핑을 살펴 봐야합니다.
4. 수집 매핑
컬렉션의 매핑은 실제로 매우 간단합니다. 해당 컬렉션 태그 만 추가하면됩니다. Hibernate는 각각 컬렉션 태그 <set>, <map>, <list> 및 <어레이>를 제공합니다. 컬렉션은 중앙 집중식 태그를 사용하여 해당 관계 테이블에 매핑됩니다. 또한 <키> 태그를 추가하여 외국 키 연관성을 달성하고 <ementt>를 사용하여 다른 속성이 추가됩니다.
CollectionMapping.hbm.xml
<? xml version = "1.0"?> <! doctype hibernate hibernate public "-// hibernate/hibernate 매핑 dtd 3.0 // 테이블 = "t_collection_mapping"> <id name = "id"> <generator // id> <property name = "name"/> <set name = "setValues"table = "t_set_values"> <key column = "set_id"> </key> <요소 유형 = "string"set_value "> </element> <list> <list value" table = "t_list_values"> <key column = "list_id"/> <list-index column = "list_index"/<emect type = "string"column = "list_value"/> </list> <map name = "mapValues"table = "t_map_values"> <key column = "map_id"/<string "stince ="map_id "> < type = "string"column = "map_value"/> </map> <array name = "arrayvalues"table = "t_array_value"> <key column = "array_id/> <index column ="array_index "type ="integer "> </index> <exement type ="column = "column ="column = "</hibernate".
목록 태그 및 배열 태그에 주목해야합니다. 이 두 세트의 객체는 순서대로 진행됩니다. 따라서 매핑 태그를 추가 할 때는 객체의 순서를 나타내는 목록 인덱스 또는 인덱스 태그를 사용해야합니다. 또한 하위 태그를 추가 할 때 순서대로 추가해야합니다. 즉, 먼저 <key> 태그를 추가 한 다음 <list-index> 태그를 추가 한 다음 마지막으로 <ementt> 태그를 추가하십시오. 그렇지 않으면 다음 오류가 나타납니다.
The content of element type "list" must match "(meta*,subselect?,cache?,synchronize*,comment?,key,(index|list-index),(element|one-to-many|many-to-many|composite-element|many-to-any),loader?,sql-insert?,sql-update?,sql-delete?,sql-delete-all?,filter*)".
5. 관계형 모델
구성된 객체 모델은 해당 관계 모델로 변환되며 생성 된 SQL 문은 다음과 같습니다.
ALTER TABLE T_ARRAY_VALUE DROP DROP DROFIT 외국 키 FK2E0ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd067676b68 Alter Table T_LIST_VALUSE DROP 외부 키 FKE01EC98BF4FCB03 ALTER TABLE T_MAP_VALUUES 외부 키 FKD169BA107402B585 ALTER TABLE TABLE TABLE TABLE TABLE TABLE TABLE TABLE DROP fk7bb8d04a7e79f8bf 드롭 테이블이 존재하는 경우 t_array_value 드롭 테이블이 존재하는 경우 t_collection_values drop table이 존재하는 경우 t_list_values drop table이 존재하는 경우 t_map_values drop table이 존재하는 경우 t_set_array (array_id varger, array_id varray, null, null, null, null varray varray). array_index 정수 NULL, 1 차 키 (array_id, array_index)))) 테이블 생성 테이블 t_collection_mapping (id integer not auto_increment, name varchar (255), 1 차 키 (id)) 테이블 t_list_value varchar (255), list_index inter, list_mat (list_index) (MAP_ID 정수 NULL, MAP_VALUE VARCHAR (255), MAP_KEY VARCHAR (255) NULL, 1 차 키 (MAP_ID, MAP_KEY)) 테이블 T_SET_VALUUES (SET_ID 정수 NULL, SET_VALUE VARCHAR (255)) ALTER TABLE T_ARRRAY_VALUE ADD INDEX ADD DD0C0676B68 COSTAINT ADD FK2E0DD0C067676B68 외국 키 (array_id) 참조 참조 T_COLLECTION_MAPPING (ID) ALTER TABLE T_LIST_VALUSE 추가 인덱스 추가 FKE01EC98BF4FCB03 (List_ID), COSTRAINT FKE01EC98BF4FCB03 외국 키 (list_id) TOTETENCE TOTENTENCE T_COLL _COLETEN T_MAP_VALUES 추가 색인 FKD169BA107402B585 (MAP_ID), 제약 조건 FKD169BA107402B585 외국 키 (MAP_ID) 참조 참조 (ID) ALTER TABLE T_SET_VALUUES ADD 인덱스 추가 FK7BB8D04A7E79F8BF (Set_ID) fk7bb8d04a7e79f8bf 외국 키 (set_id) 참조 t_collection_mapping (id)
생성 된 해당 데이터베이스보기는 다음과 같습니다.
2. 데이터 작동
1. 데이터 쓰기
데이터 작업을 작성할 때는 데이터를 작성할 때 데이터 객체 작성에주의를 기울여야합니다. 목록, 세트 및 맵은 데이터 객체를 생성하고 데이터베이스에 데이터 객체를 작성해야합니다. 세 가지 모두 객체 인터페이스이므로 객체를 만들고 객체를 데이터베이스에 작성해야합니다. 특정 코드는 다음과 같습니다.
@suppresswarnings ({ "선택 취소", "rawtypes"}) public void testsave () {세션 세션 = null; try {session = hibernateutils.getSession (); session.begintransaction (); CollectionMapping CM = New CollectionMapping (); cm.setName ( "Zhangsan"); set set = new Hashset (); set.add ( "a"); set.add ( "b"); cm.setsetValues (set); 목록 목록 = new ArrayList (); list.add ( "list1"); list.add ( "list2"); cm.setListValues (list); 문자열 [] str = new String [] { "array1", "array2"}; cm.setArrayValues (str); 지도 맵 = new Hashmap (); map.put ( "k1", "v1"); map.put ( "k2", "v2"); cm.setmapvalues (map); 세션 .Save (cm); session.getTransaction (). commit (); } catch (예외 e) {e.printstacktrace (); session.getTransaction (). Rollback (); } 마침내 {hibernateutils.closesession (세션); }}생성 된 SQL 문은 다음과 같습니다.
Hibernate : t_collection_mapping (이름) 값 (?) Hibernate에 삽입 : t_set_values (set_id, set_value) 값 (?,?) Hibernate에 삽입 : t_set_values에 삽입 (set_id, set_value) 값 (?,?) hibernate : t_list_values (list_id, list_indec) list_value) 값 (?,?,?) Hibernate : t_list_values (list_id, list_index, list_value) 값 (?,?,?) hibernate : hibernate에 삽입 : t_list_values에 삽입 (list_id, list_index, list_value) 값 (?,?) hibernate : t_list_valutes (insert int t_list _ hibernate :?) list_index, list_value) 값 (?,?,?) hibernate : t_map_values (map_id, map_key, map_value) 값 (?,?,?) Hibernate에 삽입 : t_map_values에 삽입 (map_id, map_key, map_value) 값 (?,?) hibernate :?) (array_id, array_index, array_value) 값 (?,?,?) hibernate : t_array_value에 삽입 (array_id, array_index, array_value) 값 (?,?
2. 데이터로드
데이터로드 방법은 매우 간단합니다. 세트에 따라 테이블의 데이터를 객체에로드 한 다음 해당 객체 수집 만 가져와야합니다.
public void testload () {세션 세션 = null; try {session = hibernateutils.getSession (); session.begintransaction (); CollectionMapping CM = (CollectionMapping) Session.Load (CollectionMapping.Class, 1); System.out.println ( "cm.name ="+cm.getName ()); System.out.println ( "cm.list ="+cm.getListValues ()); System.out.println ( "cm.map ="+cm.getMapValues ()); System.out.println ( "cm.array ="+cm.getArrayValues ()); System.out.println ( "cm.set ="+cm.getSetValues ()); session.getTransaction (). commit (); } catch (예외 e) {e.printstacktrace (); session.getTransaction (). Rollback (); } 마침내 {hibernateutils.closesession (세션); }}결과가 생성되었습니다.
Hibernate : collection0_.id as id0_0_, collection0_.name as t_collection_mapping collection0_에서 collection0_.id =? 최대 절전 모드 : arrayvalue0_.array_id as at array1_0_, arrayvalue0_.array_value as at array2_0_, arrayvalue0_.array_index as t_array_value arrayvalue0_ arrayvalue0_.array_id =? cm.name = zhangsan hibernate : listvalues0_.list_id as list1_0_, listvalues0_.list_value as list2_0_, listvalues0_.list_index as list3_0_ as listvalues0_ where listvalues0_.list_id =를 선택하십시오. cm.list = [list1, list2] hibernate : mapvalues0_.map_id를 map1_0_, mapvalues0_.map_value as map2_0_, mapvalues0_.map_key t_map_values as mapvalues0_ here mapvalues0_.map_id =? cm.map = {k1 = v1, k2 = v2} cm.array = [ljava.lang.string;@758d8478 Hibernate : setvalues0_.set_valuess setvalues0에서 set2_0_로 setvalues0_.set_id를 선택하십시오. cm.set = [b, a] 3. 요약
최대 절전 모드는 java.util.map, java.util.set, java.util.sortedmap, java.util.sortedset, java.util.list를 포함한 다음 Java 컬렉션의 인스턴스를 지속 할 수 있습니다 (세트 컬렉션 유형을 사용하는 것이 가장 좋은 선택입니다). java.util.collection 또는 java.util.list 유형의 특성은 "백"시맨틱을 사용하여 지속될 수 있습니다. 지속성에 사용되는 컬렉션은 컬렉션 인터페이스를 제외하고 이러한 인터페이스를 구현하는 클래스에 첨부 된 의미를 유지할 수 없습니다 (예 : LinkedHashset에서 가져온 반복 순서). 모든 영구 컬렉션은 실제로 Hashmap, Hashset, Treemap, Treeset 및 Arraylist의 의미에 따라 직접 작동합니다. 더 깊이 설명하려면 컬렉션이 포함 된 속성의 경우 Java 유형은 인터페이스 (즉, 맵, 세트 또는 목록 등)로 정의되어야하며 해시 맵, 트리 셋 또는 어레이리스트가되어서는 안됩니다. 이 제한의 이유는 모르는 경우, Hibernate는 맵, 세트 또는 목록의 자체 구현으로 인스턴스를 비밀리에 대체하고, 설정 및 목록을 대체하기 때문입니다. (따라서 프로그램에서는 == 운영자를주의해서 사용하십시오.) (참고 : 성능 및 기타 이유로 거의 모든 Java 컬렉션 인터페이스가 최대 절전 모드에서 구현됩니다. 이 경우 컬렉션 클래스의 업데이트는 매우 효율적입니다. 기본 키가 효과적으로 인덱싱되었으므로 최대 절전 모드가 행을 업데이트하거나 삭제하려고하면 해당 행의 데이터를 빠르게 찾을 수 있습니다. 세트 (세트)의 기본 키는 <key> 및 기타 요소 필드로 구성됩니다. 이것은 일부 요소 유형, 특히 조합 요소 또는 큰 텍스트 또는 큰 이진 필드에 비효율적입니다. 데이터베이스는 복잡한 기본 키를 효과적으로 색인화하지 못할 수 있습니다. 반면에, 일대일의 다수의 연관성, 특히 합성 식별자의 경우 세트는 동일한 효율적인 성능을 달성 할 수 있습니다. (1 부 : SchemaExport가 <SET>의 기본 키를 만들려면 모든 필드를 null = "true"로 선언해야합니다.) <idbag> 맵은 프록시 키를 정의하므로 항상 효율적으로 업데이트 할 수 있습니다. 실제로 <idbag>는 최고의 성능을 가지고 있습니다. 가방이 최악입니다. 백은 중복 요소 값을 허용하고 인덱스 필드가 없기 때문에 기본 키를 정의하는 것은 불가능합니다. 최대 절전 모드는 중복 선을 결정할 수 없습니다. 이러한 컬렉션이 변경되면 Hibernate는 먼저 전체 컬렉션을 완전히 제거한 다음 전체 컬렉션을 재현합니다. 따라서 가방은 매우 비효율적입니다.