1. 集合映射
集合属性
属性 | 说明 | 默认值 |
---|---|---|
name | 映射类属性的名字 | |
access | Hibernate访问这个属性的策略 默认值为property | |
table | 关联的目标数据库表 | |
chema | 目标数据库表的schema名字 | |
catalog | 目标数据库表的catalog名字 | |
lazy | 是否采用延迟加载 | |
subselect | 定义一个子查询 | |
sort | 设置排序的类型 默认值为 unsorted不排序 可选值为 natural自然排序、comparatorClass实现接口类作为排序算法 避免与order-by同时使用 | |
inverse | 用于标识双向关联中被动的一方 默认值为false | |
mutable | 标识被关联对象是否可以改变 默认值为true | |
cascade | 设置操作中的级联策略 可选值为 all所有操作情况均进行级联、none所有操作情况均不进行级联、save-update执行更新操作时级联、delete执行删除操作时级联、all-delete-orphan被关联对象失去宿主时将其删除 | |
order-by | 设置排序规则 | |
where | 增加筛选条件 | |
fetch | 设置抓取数据的策略 可选值为 join外连接抓取、select序列选择抓取 | |
atch-size | 延迟加载时,一次读取数据的数量 默认值为1 |
2. 通用属性
- name指定要映射的set集合的属性
- table集合属性要映射的表
- key指定集合表的外键字段
- element指定集合表的其他字段
type元素类型,一定要指定
- set常用属性
- List集合属性的映射
list-index是list集合一定要指定的,指定排序列的名称,因为list是有序的
- Map映射
map-key指定map的key
- bag跟set一样
可以映射类型为java.util.Collection接口的属性。
它的元素可重复,但不保存顺序,不需要额外的索引支持
- 其他
inverse 默认是false 即自己维持关联,自己是主控方
- lazy
- true是查询关联对象的时候使用延迟检索
- false 是查询关联对象的时候不使用延迟检索
- extra翻译是极其懒惰的,true已经是懒惰的,lazy等于true是不用的时候不传,我用你的时候你再传,extra更懒,比lazy等于true还要懒。
- fetch SQL语句查询方法(内连接,子查询)
- join:发送迫切左外连接的SQL查询关联对象
- select它就会分几次发送多条sql去查询你的关联对象,而join一条sql就搞定了
- subselect:发送子查询查询关联对象,使用subselect的时候需要使用query接口进行测试,不能使用get方法来进行测试,因为get看不到效果
cascade 级联操作
- 示例代码
public class CollectionTest { private Integer id; private String name; private List<Integer> lists; private Set<String> sets; private Map<String, String> postcode; private Collection collection; public Collection getCollection() { return collection; } public void setCollection(Collection collection) { this.collection = collection; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Integer> getLists() { return lists; } public void setLists(List<Integer> lists) { this.lists = lists; } public Set<String> getSets() { return sets; } public void setSets(Set<String> sets) { this.sets = sets; } public Map<String, String> getPostcode() { return postcode; } public void setPostcode(Map<String, String> postcode) { this.postcode = postcode; } }
- hbm映射
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="CollectionTest" table="TB_COLLECTION"> <id name="id" column="ID" length="4"> <generator class="native"/> </id> <property name="name" column="NAME" length="20"/> <set name="sets" table="TB_ADDRESS"> <key column="CID"/> <element column="ADDRESS" type="java.lang.String"/> </set> <list name="lists" table="TB_PHONE"> <key column="CID"></key> <list-index column="idx"/> <element column="PHONE" type="java.lang.Integer"/> </list> <map name="postcode" table="TB_POST"> <key column="CID"/> <map-key type="string" column="SHORT_NAME"/> <element type="string" column="ADDRESS"/> </map> <!--Bag类型映射--> <bag name="bagValue" table="message"> <key column="id" /> //定义外键 <element type="string" column="bagValue" /> //定义元素类型 </bag> </class> </hibernate-mapping>
使用问题集合
composite-element对应的实例类equal和hashcode方法
composite-element对应的实体类,必须重写equal和hashcode方法,不然作为set元素存储时会每次都会当做一个新的对象,导致每次get时都会对集合表先执行一次delete操作,然后再执行insert操作。
list/array base的使用
list/array的起始下标是0,这个需要注意,若集合表中的Index的起始位置不是0,则会导致list/array中有NULL元素的问题,这个时候我们可以使用base来同步集合表中Index的下标,或者集合表中Index的下标记得从0开始。
与关系映射的一点点区别
使用集合映射的时候,我们发现和关系映射中使用set/list等属性是差不多的,关系映射中单向一对多的情况,和集合映射是一样的,唯一的区别就是使用集合映射时集合表是不需要配置文件的,但是关系映射时这个多的一方必须有配置文件,这个可能是和单向一对多关系映射中最大的区别。