可以通过两个类来描述Hibernate一对多关系映射
User和Account是一对多的关系,因此有以下属性:
** User: Set accts -> Account 对象集合
** Account: User user
User.hbm.xml中,关联属性accts配置如下:
<set name="accts" cascade="all" inverse="true"> <key column="fid"/> <one-to-many class="Account"/> </set>
**<set name="accts">表示属性accts是一个集合
**cascade="all"表示级联操作的级别
**inverse="true"表示由关系的另外一端(多端)来维护关系,以提高效率
表示本身不维护表之间的关系!而由想反的一方来维护
**<key column="fid"/>表示关系另一端(多端)的关联表中和本表相关的外键字段的名字是fid
**<one-to-many class="Account">表示该集合中保存的持久对象类型是Account
Account.hbm.xml中,关联属性User配置如下:
<mang-to-one name="user" column="fid" cascade="save-update"/>
**fid为体现一对多关系的外键字段的名字
以下是一对多中一端set标签的设置
**inverse="true"就是在设置如果在内存中的修改或添加了这个集合中的某一个或某几个对象他不会将全部集合的信息同 步到数据库,而是只将集合中被修改的对象重新同步到数据库。
**cascade属性是设置级联操作的也就是在操作一端的数据如果影响到多端数据时会进行级联操作,
cascade="none",cascade="save-update",cascade="delete",cascade="all" cascade="persist"
cascade="delete-orphan",cascade属性的值常用的设置为以上五项:
**none就是不使用级联操作,默认级联是none。
**save-update也就是只有对象保存操作(持久化操作)或者是持久化对象的更新操作,才会级联操作关联对象(子对象)。
**persist就只是将级联对象也持久化到数据库。
**delete对持久化对象的删除操作时会进行级联操作关联对象(子对象)。
**all对持久化对象的所有操作都会级联操作关联对象(子对象)。
**all-delete-orphan,在多端进行删除操作时,会再多端表中留下null空纪录,设置了级联操作为delete之会将表中表示关联的外键id置成null,不会将这条纪录也删除掉,而把级联设置成delete-orphan就不会留有空纪录,而是级联的把相关纪录删除掉。
**batch-size这个属性只能够写在set标签中,这个属性代表批量加载,也就是在加载一端的集合属性时会一次加载指定的数量的对象,而不是默认的一个一个的加载,会提高效率,批量加载只能用于延迟加载和立即加载策略,也就是(lazy="true"或者lazy="false")。
**lazy="true" 延迟加载,所谓的延迟加载,就是对一端的集合属性的加载策略,就是在不使用到集合中的对象的数据就不会真正的加载集合中的对象数据,而是加载一个代理对象就相当于的一个空的容器。这也就是会出现**LazyInitializationException异常,也就是没有初始化这个代理的集合对象,在事先查询到了集合中的对象就会初始化这个对象,如果Session没有关闭就会在查询加载集合中的对象信息,如果提前关闭了Session,当使用集合中的对象信息时就会有这个异常。
**fetch="join",这就是使用了预先抓取策略,也就是针对关联的对象的加载策略,在使用到关联对象的信息时会再发送sql语句,如果不使用fetch="join",就会不使用表连接而是先查出一端的关联id再一条一条的发送sql语句查询到关联对象信息,使用了fetch="join"就会使用表连接将关联对象信息直接查寻出来的。fetch="lazy"这个是默认的设置。
注意:
在使用fetch="join"要区分开他和外连接的区别,他不会忽略配置文件中的加载策略,而使用了外连接就会忽略配置文件中使用了外连接的一端的所有加载策略,而替之为立即加载。