您的位置:首页 > 其它

Hibernate之映射集合(值类型的set,bag,idbag,list和map)

2010-09-16 18:27 288 查看
Hibernate之映射集合(值类型的set,bag,list和map)

值类型的对象不具备数据库同一性,它属于一个实体实例,其持久化状态被嵌入到所拥有实体的表行中---至少,在实体有一个对值类型的单个实例的引用的情况下。如果实体类有一个值类型的集合(或者对值类型实例的引用的集合),就需要一张额外的表,即所谓的集合表。

在将值类型的集合映射到集合表之前,要记住,值类型的类没有标识符或者标识符属性。值类型实例的生命期限由所拥有的实体实例的生命期限决定。值类型不支持共享的引用。

选择集合接口

使用接口来声明属性的类型,而不是实现。选择一种匹配的实现并立即初始化集合,这么做避免了未被初始化的集合(我们不建议在构造函数或者设置方法中太迟初始化集合)

hibernate支持最重要的JDK集合接口,它知道如何以持久化的方式保存JDK集合,映射和数组的语义。每个接口都有一个hibernate支持的匹配实现,并且使用正确的组合很重要。hibernate只包装已经在字段中声明的初始化的集合对象。

不扩展hibernate,而是从下列集合中选择:

. 使用<set>元素映射java.util.Set。使用java.util.HashSet初始化集合。它的元素顺序没有保存,并且不允许重复元素。这在典型的hibernate应用程序中是最常见的持久化集合。

. 可以使用<set>映射java.util.SortedSet,且sort属性可以设置成比较器或者用于内存排序的自然顺序。使用java.util.TreeSet实例初始化集合。

. 可以使用<list>映射java.util.List,在集合表中用一个额外的索引列保存每个元素的位置。使用java.util.ArrayList初始化。

. 可以使用<bag>或者<ibag>映射java.util.Collection. Java没有Bag接口或者实现。然而,java.util.Collection允许包语义(可能的重复,不保存元素顺序)。Hibernate支持持久化的包(它内部使用列表,但是忽略元素的索引)。使用java.util.ArrayList初始化包集合。

. 可以使用<map>映射java.util.Map,保存键值对。使用java.HashMap初始化属性.

. 可以使用<map>元素映射java.uti.SortedMap, 且sort属性可以设置为比较器或者用于内存排序的自然顺序。使用java.util.TreeMap实例初始化该集合。

. hibernate使用<primitive-array>(对于Java基本的值类型)和<array>(对于其他的一切)支持数组。但是它们很少用在领域模型中,因为hibernate无法包装数组属性。没有字节码基础设施,就失去了延迟加载,以及为持久化集合优化过的脏检查,基本的便利和性能特性
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: