Hibernate 04 : 单向多对一
1.概念
①多对一
一的一端
|
多的一端
|
User
|
Order
|
Order
|
OrderItem
|
Book
|
OrderItem
|
②单向:从Order对象中可以获取到User对象的引用,而从User对象不能获取到Order对象的引用。
2.创建持久化类
①User[一的一端]:不需要包含Order集合的引用
②Order[多的一端]:需要包含User对象的引 用
3.hbm文件中的配置
①User[一的一端]:进行普通的单表映射即可
②Order[多的一端]:
4.关于保存的顺序
如果先保存Order对象,再保存关联的User对象,则会多出额外的update语句。原因:
①保存Order对象时,USER_FK这一列无法赋值,只能暂时设置为null
②必须等到User对象保存完毕,生成了User的主键值,然后才能回过头来设置ORDERS表的外键列的值
5.关于延迟加载
①默认情况下,加载一个Order对象,不会立即加载关联的User对象,而是对User对象采取延迟加载策略。使用一个代理对象作为User对象,当用到非OID的属性值时才发送SQL语句,查询User对象。
②凡是有延迟加载存在的场合,都有产生“懒加载初始化异常”的可能。
③设置立即加载
<many-to-one
lazy
="false"
|
查询得到Order之后,就会立即查询关联的User对象。
④迫切左外连接
<many-to-one
fetch
="join"
|
select
order0_.ORDER_ID as ORDER_ID1_0_1_,
order0_.ORDER_NAME as ORDER_NA2_0_1_,
order0_.USER_FK as USER_FK3_0_1_,
user1_.USER_ID as USER_ID1_1_0_,
user1_.USER_NAME as USER_NAM2_1_0_
from
ORDERS order0_
left outer join
USERS user1_
on order0_.USER_FK=user1_.USER_ID
where
order0_.ORDER_ID=?
|