选择集合接口:
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)集合
- */
- public class Item implements Serializable {
- private int itemId;
- private String itemName;
- //不允许重复
- private Set<String> images = new HashSet<String>();
配置文件:
- <hibernate-mapping package="cn.partner4java.set">
- <class name="Item">
- <id name="itemId">
- <generator class="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 = new Item();
- 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 = new Item();
- 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
- */
- public class Item implements Serializable {
- private Integer itemId;
- private String itemName;
- private Collection<String> images = new ArrayList<String>();
配置文件:
- <hibernate-mapping package="cn.partner4java.connection">
- <class name="Item">
- <id name="itemId" type="integer">
- <generator class="native"/>
- </id>
- <property name="itemName" type="string"/>
- <!-- 映射了一个无序的string集合 -->
- <idbag name="images" table="ITEM_IMAGES">
- <!-- 给集合加一个id -->
- <collection-id type="integer" column="ITEM_IMAGE_ID">
- <generator class="increment"></generator>
- </collection-id>
- <key column="ITEM_ID"></key>
- <element type="string" column="FILENAME" not-null="true"></element>
- </idbag>
- </class>
- </hibernate-mapping>
插入:
- Item item = new Item();
- 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
- */
- public class Item implements Serializable {
- private Integer itemId;
- private String itemName;
- private List<String> images = new ArrayList<String>();
配置文件:
- <hibernate-mapping package="cn.partner4java.list">
- <class name="Item">
- <id name="itemId" type="integer">
- <generator class="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 = new Item();
- 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
- */
- public class Item implements Serializable {
- private int itemId;
- private String itemName;
- private Map<String, String> images = new HashMap<String, String>();
配置文件:
- <hibernate-mapping package="cn.partner4java.map">
- <class name="Item">
- <id name="itemId">
- <generator class="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 = new Item();
- 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,排序集合
- */
- public class Item implements Serializable {
- private int itemId;
- private String itemName;
- private SortedMap<String, String> images = new TreeMap<String, String>();
配置文件:
- <hibernate-mapping package="cn.partner4java.sortedmap">
- <class name="Item">
- <id name="itemId">
- <generator class="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 = new Item();
- 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 子句的一个片段,可以按集合表的任何列进行排序。
相关推荐
常见的集合映射类型有 Set、List、Array、Map 和 Bag 等,每种类型都有其特点和应用场景。 Set 集合映射 Set 集合是 Hibernate 中基础的集合类型,元素数据一般使用外键同主表关联。Set 集合非常适用于集合元素不...
正确配置和使用各种集合类型,如List、Set和Map,可以帮助我们更好地处理数据库中的复杂关系,提高代码的灵活性和可扩展性。同时,关注性能优化策略,如懒加载和批处理,对于大型项目尤为重要。
`map-key`定义了映射键的列和类型,`element`定义了映射值的列和类型。 4. **Bag集合映射** Bag是Hibernate特有的集合类型,类似于List,但不保证元素顺序,性能上比List略优。配置方式与List类似,但使用`<bag>`...
在Java中,常见的集合类型有List、Set、Map等,它们在Hibernate中都有对应的映射方式。 1. **List映射**:List是最基础的集合类型,它允许元素重复并保持插入顺序。在Hibernate中,我们可以使用`<list>`标签来映射...
Hibernate支持多种集合类型,如ArrayList(对应Bag)、LinkedList(对应List)、HashSet(对应Set)、TreeSet(对应SortedSet)、LinkedHashSet(对应OrderedSet)和HashMap(对应Map)。这些集合用于表示对象之间的...
6.1 值类型的set、bag、list和map 6.1.1 选择集合接口 6.1.2 映射set 6.1.3 映射标识符bag 6.1.4 映射list 6.1.5 映射map 6.1.6 排序集合和有序集合 6.2 组件的集合 6.2.1 编写组件...
1. **集合类型**:在Hibernate中,集合类型通常有List、Set、Map和Bag等。List保证元素顺序,可能有重复元素;Set不允许有重复元素,不保证元素顺序;Map则存储键值对,其中键是唯一的;Bag则与List类似,但不保证...
集合映射可以是 set、list、map、bag、array 等。级联策略控制可以控制集合元素的保存和删除。排序策略可以控制集合元素的顺序。 聚合映射 Hibernate 的聚合映射可以将多个对象聚合到一个对象中。聚合映射可以是...
在给定的文档“JAVA培训-HIBERNATE的集合映射.doc”中,主要讲解了Hibernate如何处理不同类型的集合映射,包括Set、List、Array、Map和Bag。我们将详细讨论这些集合映射以及它们在实际应用中的使用。 首先,我们来...
你必须作出一个选择,要么在组合元素中使用不能为空的属性,要么选择使用<list>,<map>,<bag> 或者 而不是 <set>。 组合元素有个特别的用法是它可以包含一个元素。类似这样的映射允许你将一个many-to-many关联表...
12. **集合映射**:包括List、Set、Map等类型的集合,Hibernate提供了不同的策略进行映射,如Bag、List、Set、Map等。 在SSH框架中,Hibernate主要负责数据层的处理,与Struts(视图层)和Spring(控制层和业务层)...
Hibernate支持多种集合映射类型,包括List、Set、Map、Bag、Array等。它们之间的区别主要在于元素的唯一性、顺序性和映射到数据库的实现方式。例如,List和Array维护元素的插入顺序,而Set不允许重复元素;Map则...
10.3.1 区分值(Value)类型和实体(Entity)类型 10.3.2 在应用程序中访问具有组成关系的持久化类 10.4 映射复合组成关系 10.5 小结 10.6 思考题 第11章 Hibernate的映射类型 11.1 Hibernate的内置映射...
1. 选择合适的集合类型:根据业务需求,合理选择List、Set、Map或Bag作为关联集合,注意它们在数据存储和查询上的差异。 2. 使用懒加载(lazy="true"):默认情况下,关联数据会随着主对象一起加载,但通常不建议...
Hibernate提供了`<order-by>`和`<composite-element>`标签来实现集合元素的排序,以及`<bag>`集合类型来支持无序集合。对于复杂的数据结构,如嵌套集合,可以使用`<composite-element>`定义复合元素。 综上所述,...
Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测SessionFactory 19.6.2. 数据记录(Metrics) 20. 工具箱指南 20.1. ...
- **map**、**set**、**list**、**bag**:集合类型的映射。 - **import**:引入其他映射文件。 ##### 4.2 Hibernate类型 - **实体与值**:实体类与值类型的区别。 - **基本值类型**:如字符串、整型等。 - **持久...
map, set, list, bag 5.1.16. 引用(import) 5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 持久化枚举(Persistent enum)类型 5.2.4. 自定义值类型...
11. **集合映射**:了解List, Set, Bag, Map等各种集合类型的映射方式,以及元素类型和索引的配置。 12. **性能优化**:包括批处理操作、缓存配置、连接池的使用、延迟加载的控制等,提升Hibernate应用的性能。 13...