选择集合接口:
1、使用<Set>元素映射java.util.Set。使用java.util.HashSet初始化集合。它是无序且不允许重复。
2、使用<Set>映射java.util.SortedSet。且sort属性可以设置成比较器或者用于内存的排序的自然顺序。使用
java.util.TreeSet实例初始化集合。
3、使用<list>映射java.util.List。在集合表中用一个额外的索引列保存每个元素的位置。使用java.util.ArrayList初始化。
4、使用<bag>或者<idbag>映射java.util.Collection。java没有Bag接口或者实现;然而,java.util.Collection允许包
语义。hibernate支持持久化的包。使用java.util.ArrayList初始化包集合。
5、使用<map>映射java.util.Map,保存键和值对。使用java.util.HashMap初始化属性。
6、使用<map>映射java.util.SortedMap。且sort属性可以设置为比较器或者用于内存排序的自然顺序。使用
java.util.TreeMap实例初始化该集合。
7、hibernate使用<primitve-array>和<array>支持数组。但是他们很少使用在领域模型中。因为hibernate无法
包装数组属性,没有字节码基础设施(BCI),就失去了延迟加载,以及持久化集合优化过的脏检查、基本
的便利和性能特性。
映射Set:
无序不允许重复:
类:
配置文件:
插入2:
插入2:
映射bag:
有序允许重复:
类:
配置文件:
插入:
hibernate打印sql:
Hibernate: insert into Item (itemName) values (?)
Hibernate: select max(ITEM_IMAGE_ID) from ITEM_IMAGES
Hibernate: insert into ITEM_IMAGES (ITEM_ID, ITEM_IMAGE_ID, FILENAME) values (?, ?, ?)
Hibernate: insert into ITEM_IMAGES (ITEM_ID, ITEM_IMAGE_ID, FILENAME) values (?, ?, ?)
注意:
<collection-id type="integer" column="ITEM_IMAGE_ID">
<generator class="increment"></generator>
</collection-id>
这里的generator给的类型是increment,如果mysql给的是native或者identity会报错:
org.hibernate.id.IdentifierGeneratorFactory$2 cannot be cast to java.lang.Integer
但是oracle使用native、sequence不会报错(应该是这个版本的hibernate的bug)
**删除**:
(如果没记错的话,类类型的set集合,是不会删除子集的,只默认级联一的一端)
这里是都级联删除的
Item item = (Item) session.get(Item.class, 2);
session.delete(item);
Hibernate: select item0_.itemId as itemId0_0_, item0_.itemName as itemName0_0_ from Item item0_ where item0_.itemId=?
Hibernate: delete from ITEM_IMAGES where ITEM_ID=?
Hibernate: delete from Item where itemId=?
映射list(允许重复,有序):
配置文件:
插入:
hibernate打印sql:
Hibernate: insert into Item (itemName) values (?)
Hibernate: insert into ITEM_IMAGES (ITEM_ID, POSITION, FILENAME) values (?, ?, ?)
Hibernate: insert into ITEM_IMAGES (ITEM_ID, POSITION, FILENAME) values (?, ?, ?)
(POSITION记录的就是list的指针位置0、1、2...)
删除:
Hibernate: select item0_.itemId as itemId0_0_, item0_.itemName as itemName0_0_ from Item item0_ where item0_.itemId=?
Hibernate: delete from ITEM_IMAGES where ITEM_ID=?
Hibernate: delete from Item where itemId=?
映射map(无序,不允许重复):
类:
配置文件:
插入:
hibernate打印sql:
Hibernate: insert into Item (itemName) values (?)
Hibernate: insert into ITEM_IMAGES (ITEM_ID, IMAGENAME, FILENAME) values (?, ?, ?)
映射sortedmap,排序集合:
类:
配置文件:
插入:
hibernate打印sql:
Hibernate: insert into Item (itemName) values (?)
Hibernate: insert into ITEM_IMAGES (ITEM_ID, IMAGENAME, FILENAME) values (?, ?, ?)
Hibernate: insert into ITEM_IMAGES (ITEM_ID, IMAGENAME, FILENAME) values (?, ?, ?)
(数据中,images1的插入顺序是按照string排序的,也就是先插入了imagename1)
order-by:
<map name="images" table="ITEM_IMAGES" order-by="">
<set name="images" table="ITEM_IMAGES" order-by="FILENAME asc">
order-by属性中的表达式是SQL order by 子句的一个片段,可以按集合表的任何列进行排序。
1、使用<Set>元素映射java.util.Set。使用java.util.HashSet初始化集合。它是无序且不允许重复。
2、使用<Set>映射java.util.SortedSet。且sort属性可以设置成比较器或者用于内存的排序的自然顺序。使用
java.util.TreeSet实例初始化集合。
3、使用<list>映射java.util.List。在集合表中用一个额外的索引列保存每个元素的位置。使用java.util.ArrayList初始化。
4、使用<bag>或者<idbag>映射java.util.Collection。java没有Bag接口或者实现;然而,java.util.Collection允许包
语义。hibernate支持持久化的包。使用java.util.ArrayList初始化包集合。
5、使用<map>映射java.util.Map,保存键和值对。使用java.util.HashMap初始化属性。
6、使用<map>映射java.util.SortedMap。且sort属性可以设置为比较器或者用于内存排序的自然顺序。使用
java.util.TreeMap实例初始化该集合。
7、hibernate使用<primitve-array>和<array>支持数组。但是他们很少使用在领域模型中。因为hibernate无法
包装数组属性,没有字节码基础设施(BCI),就失去了延迟加载,以及持久化集合优化过的脏检查、基本
的便利和性能特性。
映射Set:
无序不允许重复:
类:
- /**
- * 实现String类型的set集合,非class(实体bean)集合
- */
- publicclassItemimplementsSerializable {
- privateintitemId;
- privateString itemName;
- //不允许重复
- privateSet<String> images =newHashSet<String>();
配置文件:
- <hibernate-mappingpackage="cn.partner4java.set">
- <classname="Item">
- <id name="itemId">
- <generatorclass="native"/>
- </id>
- <property name="itemName"type="string"/>
- <!-- 映射了一个无序的string集合 -->
- <set name="images"table="ITEM_IMAGES">
- <key column="ITEM_ID"></key>
- <element type="string"column="FILENAME"not-null="true"></element>
- </set>
- </class>
- </hibernate-mapping>
插入2:
- Item item =newItem();
- item.setItemName("hello world");
- item.getImages().add("image1");
- item.getImages().add("image1");
- hibernate 打印 sql:
- Hibernate: insert into Item (itemName) values (?)
- Hibernate: insert into ITEM_IMAGES (ITEM_ID, FILENAME) values (?, ?)
插入2:
- Item item =newItem();
- item.setItemName("hello world");
- item.getImages().add("image1");
- item.getImages().add("image2");
- hibernate打印sql:
- Hibernate: insert into Item (itemName) values (?)
- Hibernate: insert into ITEM_IMAGES (ITEM_ID, FILENAME) values (?, ?)
- Hibernate: insert into ITEM_IMAGES (ITEM_ID, FILENAME) values (?, ?)
映射bag:
有序允许重复:
类:
- /**
- * 允许重复元素的无序集合bag
- */
- publicclassItemimplementsSerializable {
- privateInteger itemId;
- privateString itemName;
- privateCollection<String> images =newArrayList<String>();
配置文件:
- <hibernate-mappingpackage="cn.partner4java.connection">
- <classname="Item">
- <id name="itemId"type="integer">
- <generatorclass="native"/>
- </id>
- <property name="itemName"type="string"/>
- <!-- 映射了一个无序的string集合 -->
- <idbag name="images"table="ITEM_IMAGES">
- <!-- 给集合加一个id -->
- <collection-id type="integer"column="ITEM_IMAGE_ID">
- <generatorclass="increment"></generator>
- </collection-id>
- <key column="ITEM_ID"></key>
- <element type="string"column="FILENAME"not-null="true"></element>
- </idbag>
- </class>
- </hibernate-mapping>
插入:
- Item item =newItem();
- item.setItemName("hello world");
- item.getImages().add("image1");
- item.getImages().add("image1");
hibernate打印sql:
Hibernate: insert into Item (itemName) values (?)
Hibernate: select max(ITEM_IMAGE_ID) from ITEM_IMAGES
Hibernate: insert into ITEM_IMAGES (ITEM_ID, ITEM_IMAGE_ID, FILENAME) values (?, ?, ?)
Hibernate: insert into ITEM_IMAGES (ITEM_ID, ITEM_IMAGE_ID, FILENAME) values (?, ?, ?)
注意:
<collection-id type="integer" column="ITEM_IMAGE_ID">
<generator class="increment"></generator>
</collection-id>
这里的generator给的类型是increment,如果mysql给的是native或者identity会报错:
org.hibernate.id.IdentifierGeneratorFactory$2 cannot be cast to java.lang.Integer
但是oracle使用native、sequence不会报错(应该是这个版本的hibernate的bug)
**删除**:
(如果没记错的话,类类型的set集合,是不会删除子集的,只默认级联一的一端)
这里是都级联删除的
Item item = (Item) session.get(Item.class, 2);
session.delete(item);
Hibernate: select item0_.itemId as itemId0_0_, item0_.itemName as itemName0_0_ from Item item0_ where item0_.itemId=?
Hibernate: delete from ITEM_IMAGES where ITEM_ID=?
Hibernate: delete from Item where itemId=?
映射list(允许重复,有序):
- /**
- * 映射list
- */
- publicclassItemimplementsSerializable {
- privateInteger itemId;
- privateString itemName;
- privateList<String> images =newArrayList<String>();
配置文件:
- <hibernate-mappingpackage="cn.partner4java.list">
- <classname="Item">
- <id name="itemId"type="integer">
- <generatorclass="native"/>
- </id>
- <property name="itemName"type="string"/>
- <list name="images"table="ITEM_IMAGES">
- <key column="ITEM_ID"></key>
- <!--2.X兼容方式,不在使用<index></index> -->
- <list-index column="POSITION"></list-index>
- <element type="string"column="FILENAME"not-null="true"></element>
- </list>
- </class>
- </hibernate-mapping>
插入:
- Item item =newItem();
- item.setItemName("hello world");
- item.getImages().add("image1");
- item.getImages().add("image1");
hibernate打印sql:
Hibernate: insert into Item (itemName) values (?)
Hibernate: insert into ITEM_IMAGES (ITEM_ID, POSITION, FILENAME) values (?, ?, ?)
Hibernate: insert into ITEM_IMAGES (ITEM_ID, POSITION, FILENAME) values (?, ?, ?)
(POSITION记录的就是list的指针位置0、1、2...)
删除:
- Item item = (Item) session.get(Item.class,2);
- session.delete(item);
Hibernate: select item0_.itemId as itemId0_0_, item0_.itemName as itemName0_0_ from Item item0_ where item0_.itemId=?
Hibernate: delete from ITEM_IMAGES where ITEM_ID=?
Hibernate: delete from Item where itemId=?
映射map(无序,不允许重复):
类:
- /**
- * 映射map
- */
- publicclassItemimplementsSerializable {
- privateintitemId;
- privateString itemName;
- privateMap<String, String> images =newHashMap<String, String>();
配置文件:
- <hibernate-mappingpackage="cn.partner4java.map">
- <classname="Item">
- <id name="itemId">
- <generatorclass="native"/>
- </id>
- <property name="itemName"type="string"/>
- <map name="images"table="ITEM_IMAGES">
- <key column="ITEM_ID"></key>
- <map-key type="string"column="IMAGENAME"></map-key>
- <element type="string"column="FILENAME"not-null="true"/>
- </map>
- </class>
- </hibernate-mapping>
插入:
- Item item =newItem();
- item.setItemName("hello world");
- item.getImages().put("imagename1","filename1");
- item.getImages().put("imagename1","filename1");
hibernate打印sql:
Hibernate: insert into Item (itemName) values (?)
Hibernate: insert into ITEM_IMAGES (ITEM_ID, IMAGENAME, FILENAME) values (?, ?, ?)
映射sortedmap,排序集合:
类:
- /**
- * 映射sortedmap,排序集合
- */
- publicclassItemimplementsSerializable {
- privateintitemId;
- privateString itemName;
- privateSortedMap<String, String> images =newTreeMap<String, String>();
配置文件:
- <hibernate-mappingpackage="cn.partner4java.sortedmap">
- <classname="Item">
- <id name="itemId">
- <generatorclass="native"/>
- </id>
- <property name="itemName"type="string"/>
- <!-- sort="natural"是按照string进行排序,也可实现java.util.Comparator 如:srot="cn.partner4java.MyComp"-->
- <map name="images"table="ITEM_IMAGES"sort="natural">
- <key column="ITEM_ID"></key>
- <map-key type="string"column="IMAGENAME"></map-key>
- <element type="string"column="FILENAME"not-null="true"/>
- </map>
- </class>
- </hibernate-mapping>
插入:
- Item item =newItem();
- item.setItemName("hello world");
- item.getImages().put("imagename2","filename2");
- item.getImages().put("imagename1","filename1");
hibernate打印sql:
Hibernate: insert into Item (itemName) values (?)
Hibernate: insert into ITEM_IMAGES (ITEM_ID, IMAGENAME, FILENAME) values (?, ?, ?)
Hibernate: insert into ITEM_IMAGES (ITEM_ID, IMAGENAME, FILENAME) values (?, ?, ?)
(数据中,images1的插入顺序是按照string排序的,也就是先插入了imagename1)
order-by:
<map name="images" table="ITEM_IMAGES" order-by="">
<set name="images" table="ITEM_IMAGES" order-by="FILENAME asc">
order-by属性中的表达式是SQL order by 子句的一个片段,可以按集合表的任何列进行排序。