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

原创 2011年10月19日 18:01:12
选择集合接口: 
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. public class Item implements Serializable {  
  5.     private int itemId;  
  6.     private String itemName;  
  7.       
  8.     //不允许重复  
  9.     private Set<String> images = new HashSet<String>();  

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

插入2:
  1. Item item = new Item();  
  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 = new Item();  
  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. public class Item implements Serializable {  
  5.     private Integer itemId;  
  6.     private String itemName;  
  7.     private Collection<String> images = new ArrayList<String>();  

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

插入:
  1. Item item = new Item();  
  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. public class Item implements Serializable {  
  5.     private Integer itemId;  
  6.     private String itemName;  
  7.     private List<String> images = new ArrayList<String>();  

配置文件:
  1. <hibernate-mapping package="cn.partner4java.list">  
  2.     <class name="Item">  
  3.         <id name="itemId" type="integer">  
  4.             <generator class="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 = new Item();  
  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.class2);  
  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. public class Item implements Serializable {  
  5.     private int itemId;  
  6.     private String itemName;  
  7.       
  8.     private Map<String, String> images = new HashMap<String, String>();  

配置文件:
  1. <hibernate-mapping package="cn.partner4java.map">  
  2.     <class name="Item">  
  3.         <id name="itemId">  
  4.             <generator class="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 = new Item();  
  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. public class Item implements Serializable {  
  5.     private int itemId;  
  6.     private String itemName;  
  7.       
  8.     private SortedMap<String, String> images = new TreeMap<String, String>();  

配置文件:
  1. <hibernate-mapping package="cn.partner4java.sortedmap">  
  2.     <class name="Item">  
  3.         <id name="itemId">  
  4.             <generator class="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 = new Item();  
  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 子句的一个片段,可以按集合表的任何列进行排序。 

JavaBean中布尔类型使用注意

JavaBean是一个标准,遵循标准的Bean是一个带有属性和getters/setters方法的Java类。JavaBean的定义很简单,但是还有有一些地方需要注意,例如Bean中含有boolean...
  • danchu
  • danchu
  • 2017年04月26日 19:59
  • 1379

配置spring的配置list,map,set,props集合属性

在spring中,可以通过一组内置的xml标签(,,) 配置集合的属性,在配置java.util.List类型的属性的时候,需要制定标签,在标签里包含一些元素,这些标签可以通过指定简单的常量值,通...
  • mggwct
  • mggwct
  • 2015年04月18日 15:53
  • 2164

关于hibernate的实体类中有集合类型转化成JSON的工具类

在做项目中遇见了包含集合类型(Set,List)的实体类,转化为json时报错。报错信息为: java.lang.StackOverflowError:该错误是由于当前线程的栈满了  ,也就是函数调用...
  • zczzsq
  • zczzsq
  • 2014年01月23日 09:16
  • 5760

hibernate第二天——值类型的集合(set,map,list,bag,sort,order-by),实体类型集合,关联关系,3l类型Long,inverse,级联

1、值类型的集合 集合元素是普通类型 (1)、数据存放类型 Set         HashSet 无序,不重复 List         有序,可重复 Map         键值对    ...
  • danny1991
  • danny1991
  • 2015年12月15日 11:15
  • 753

Hibernate的集合映射(Set、List、Array、Map、Bag)

POJOs如下: Customer类------>customer表   Order类对应---------->orders表  customer(1)(n)order public ...
  • pengpegV5yaya
  • pengpegV5yaya
  • 2014年05月07日 10:10
  • 1926

Hibernate常见的集合映射主要有Set,List,Array,Map,Bag等

Hibernate常见的集合映射主要有Set,List,Array,Map,Bag等,它们的特点如下: 1) Set集合是Hibernate中基础的集合类型,元素数据一般使用外键同主表关联,Set集...
  • wfgeqgeq
  • wfgeqgeq
  • 2011年12月13日 21:53
  • 468

hibernate 集合(set, list, array,bag, map)

Hibernate中将集合分为四类: (1)元素:可以映射类型为java.util.Set接口的属性,它的元素存放没有顺序且不允许重复,也可以映射类型为java.util.SortSet接口...
  • huang798807481
  • huang798807481
  • 2012年05月03日 09:29
  • 664

【学习笔记】Hibernate映射List、Map、数组、Set、Bag的具体操作

注意:使用集合映射类声明时要注意使用接口而不是具体实现类。因为经过Session操作后,集合就变成了hibernate自己的集合实现类。...
  • nthack5730
  • nthack5730
  • 2015年04月21日 11:57
  • 11820

Java list、map、set、vector集合类型中的null值

在面向对象语言中,空(Empty)、空值(Null)、不存在(Not Exists)分别具有这不同含义。 举个通俗的例子:空表示这个位置是用来放这个东西的,但是这个东西的数量现在是0; Null是一...
  • chy555chy
  • chy555chy
  • 2016年08月22日 12:00
  • 2726

json字符串实体bean或者List&lt;bean&gt;互转(gson和jackson,支持泛型)

  • 2016年04月15日 11:32
  • 7KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hibernate 值类型的set、bag、list和map (非实体bean类型的)
举报原因:
原因补充:

(最多只允许输入30个字)