hibernate 值类型的set、bag、list和map (非实体bean类型的)

选择集合接口:
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:

无序不允许重复:
类:
  1. /**
  2. * 实现String类型的set集合,非class(实体bean)集合
  3. */
  4. publicclassItemimplementsSerializable {
  5. privateintitemId;
  6. privateString itemName;
  7. //不允许重复
  8. privateSet<String> images =newHashSet<String>();

配置文件:
  1. <hibernate-mappingpackage="cn.partner4java.set">
  2. <classname="Item">
  3. <id name="itemId">
  4. <generatorclass="native"/>
  5. </id>
  6. <property name="itemName"type="string"/>
  7. <!-- 映射了一个无序的string集合 -->
  8. <set name="images"table="ITEM_IMAGES">
  9. <key column="ITEM_ID"></key>
  10. <element type="string"column="FILENAME"not-null="true"></element>
  11. </set>
  12. </class>
  13. </hibernate-mapping>

插入2:
  1. Item item =newItem();
  2. item.setItemName("hello world");
  3. item.getImages().add("image1");
  4. item.getImages().add("image1");
  5. hibernate 打印 sql:
  6. Hibernate: insert into Item (itemName) values (?)
  7. Hibernate: insert into ITEM_IMAGES (ITEM_ID, FILENAME) values (?, ?)

插入2:
  1. Item item =newItem();
  2. item.setItemName("hello world");
  3. item.getImages().add("image1");
  4. item.getImages().add("image2");
  5. hibernate打印sql:
  6. Hibernate: insert into Item (itemName) values (?)
  7. Hibernate: insert into ITEM_IMAGES (ITEM_ID, FILENAME) values (?, ?)
  8. Hibernate: insert into ITEM_IMAGES (ITEM_ID, FILENAME) values (?, ?)





映射bag:
有序允许重复:
类:
  1. /**
  2. * 允许重复元素的无序集合bag
  3. */
  4. publicclassItemimplementsSerializable {
  5. privateInteger itemId;
  6. privateString itemName;
  7. privateCollection<String> images =newArrayList<String>();

配置文件:
  1. <hibernate-mappingpackage="cn.partner4java.connection">
  2. <classname="Item">
  3. <id name="itemId"type="integer">
  4. <generatorclass="native"/>
  5. </id>
  6. <property name="itemName"type="string"/>
  7. <!-- 映射了一个无序的string集合 -->
  8. <idbag name="images"table="ITEM_IMAGES">
  9. <!-- 给集合加一个id -->
  10. <collection-id type="integer"column="ITEM_IMAGE_ID">
  11. <generatorclass="increment"></generator>
  12. </collection-id>
  13. <key column="ITEM_ID"></key>
  14. <element type="string"column="FILENAME"not-null="true"></element>
  15. </idbag>
  16. </class>
  17. </hibernate-mapping>

插入:
  1. Item item =newItem();
  2. item.setItemName("hello world");
  3. item.getImages().add("image1");
  4. 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(允许重复,有序):
  1. /**
  2. * 映射list
  3. */
  4. publicclassItemimplementsSerializable {
  5. privateInteger itemId;
  6. privateString itemName;
  7. privateList<String> images =newArrayList<String>();

配置文件:
  1. <hibernate-mappingpackage="cn.partner4java.list">
  2. <classname="Item">
  3. <id name="itemId"type="integer">
  4. <generatorclass="native"/>
  5. </id>
  6. <property name="itemName"type="string"/>
  7. <list name="images"table="ITEM_IMAGES">
  8. <key column="ITEM_ID"></key>
  9. <!--2.X兼容方式,不在使用<index></index> -->
  10. <list-index column="POSITION"></list-index>
  11. <element type="string"column="FILENAME"not-null="true"></element>
  12. </list>
  13. </class>
  14. </hibernate-mapping>

插入:
  1. Item item =newItem();
  2. item.setItemName("hello world");
  3. item.getImages().add("image1");
  4. 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...)
删除:
  1. Item item = (Item) session.get(Item.class,2);
  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(无序,不允许重复):
类:
  1. /**
  2. * 映射map
  3. */
  4. publicclassItemimplementsSerializable {
  5. privateintitemId;
  6. privateString itemName;
  7. privateMap<String, String> images =newHashMap<String, String>();

配置文件:
  1. <hibernate-mappingpackage="cn.partner4java.map">
  2. <classname="Item">
  3. <id name="itemId">
  4. <generatorclass="native"/>
  5. </id>
  6. <property name="itemName"type="string"/>
  7. <map name="images"table="ITEM_IMAGES">
  8. <key column="ITEM_ID"></key>
  9. <map-key type="string"column="IMAGENAME"></map-key>
  10. <element type="string"column="FILENAME"not-null="true"/>
  11. </map>
  12. </class>
  13. </hibernate-mapping>

插入:
  1. Item item =newItem();
  2. item.setItemName("hello world");
  3. item.getImages().put("imagename1","filename1");
  4. item.getImages().put("imagename1","filename1");

hibernate打印sql:
Hibernate: insert into Item (itemName) values (?)
Hibernate: insert into ITEM_IMAGES (ITEM_ID, IMAGENAME, FILENAME) values (?, ?, ?)




映射sortedmap,排序集合:
类:
  1. /**
  2. * 映射sortedmap,排序集合
  3. */
  4. publicclassItemimplementsSerializable {
  5. privateintitemId;
  6. privateString itemName;
  7. privateSortedMap<String, String> images =newTreeMap<String, String>();

配置文件:
  1. <hibernate-mappingpackage="cn.partner4java.sortedmap">
  2. <classname="Item">
  3. <id name="itemId">
  4. <generatorclass="native"/>
  5. </id>
  6. <property name="itemName"type="string"/>
  7. <!-- sort="natural"是按照string进行排序,也可实现java.util.Comparator 如:srot="cn.partner4java.MyComp"-->
  8. <map name="images"table="ITEM_IMAGES"sort="natural">
  9. <key column="ITEM_ID"></key>
  10. <map-key type="string"column="IMAGENAME"></map-key>
  11. <element type="string"column="FILENAME"not-null="true"/>
  12. </map>
  13. </class>
  14. </hibernate-mapping>

插入:
  1. Item item =newItem();
  2. item.setItemName("hello world");
  3. item.getImages().put("imagename2","filename2");
  4. 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 子句的一个片段,可以按集合表的任何列进行排序。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值