天天看点

第九章 关系映射 一对多关联映射

如:department与employee

employee中有一个department_id的外键

department:

employee:

department.hbm.xml:(与普通的映射文件一样)

employee.hbm.xml:

增加:

查询:

查询department的时候可以得到外键关联的所有employee对象。

注意事项:

a、错误提示:field'department_id'

doesn't have a default value

   数据表中把"department_id"设成可以为空的,但是hibernate先执行的是:

因为hibernate执行的顺序是这样的:

hibernate:insert into hibernate.department (name) values (?)

hibernate:insert into hibernate.employee (name) values (?)

hibernate:update hibernate.employee set department_id=? where id=?

department_id外键是作为一个后来才更新的存在。所有不能设置为非空的。

b、department.hbm.xml中要设置cascade="all"(级联),或其它有效值,不然,在保存department对象时,相关的employee对象不会被保存。(none,all,save-update,delete..)

c、department.hbm.xml中set标签的inverse属性不能设置为"true"(放弃维护关联关系),inverse的默认值是"false",所以不加inverse也可以。看书上说:在一对多的关联关系实现中,最好设置inverse="true",将有助于性能的改善。所以一开始就用了inverse="true",user和card对象都分别正确写入数据库了,但是就是departmentid字段没有被自动写入。

d、多对一与一对多可以一起用,形成双向关系。

e.one-to-many、many-to-one、many-to-many懒加载分析:

必须同时满足下面的两个条件时才能实现懒散加载:

1).lazy!=false(lazy缺省方式就!=false,lazy是=proxy)

2).fetch=select(fetch缺省方式即为select)