一,基础知识
lazy是指什么时候抓取(fetch)
fetch是指通过什么方式抓取
lazy取值:proxy(缺省),no-proxy,false(hibernate3.0前只有false和true两个值)
fetch取值:select(缺省),join
fetch为join时lazy失效(原因:因为进行了联表查询,所有lazy就没用了)
将关系在many一端维护的原因:
1,在one的一端维护关系,他会发多余的update
不发update的方法: <set/> 可以使用inverse="true" 来时many一端不维护关系
但是只是不发update,所有还是有问题,次表的关系字段为null
2,在one的一端维护关系,如果次表中的那个关联的字段设置为非空 ,插入次对象时就会报错
二,many-to-one 与 one-to-many
次对象 many-to-one :(1,不自动级联 2,支持 懒加载 )
<many-to-one name="classes "/>
主对象 one-to-many :(1,不自动级联(最好用many一端维护关系) 2,支持懒 加载 )
<set name="students ">
<key column="classesid " not-null="true "/>
<one-to-many class="Student "/>
</set>
三,one-to-one(默认情况下<one-to-one>是将自己的主键个关联表的主键对应)
1,主键关联
次对象 :(1,自动级联 2,支持 懒加载 )
<id name="id">
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
<one-to-one name="xxxx" constrained ="true"/>
主对象 :(1,不支持懒 加载 fetch="join(默认) )
<one-to-one name="xxxx"> 查询关联对象时,发联表 sql语句
2,唯一外键关联
次对象 :(1,不自动级联 2, 支持 懒加载 )
<many-to-one name="xxxx" unique ="true"/>
主对象 :(1,不支持懒加 载fetch="join(默认) )
<one-to-one name="xxxx" property-ref ="xxxx"/>
四,many-to-many
<set name="roles" table ="t_user_role">
<key column ="userid"/> -----自己的字段
<many-to-many class="Role" column ="roleid"/> -----他人的字段
</set>
<set name="roles" table ="t_user_role" order-by ="userid"> --安装什么属性排序
<key column ="roleid"/> -----自己的字段
<many-to-many class="User" column ="userid"/> -----他人的字段
</set>
五,session.save(obj)时,主键生成策略不同,发sql语句的时机也不同
native :save(obj)后就发sql语句(因为native是数据库提供主键生成,如果不发布知道主键的值)
uuid :save(obj)后是不会发sql语句(因为uuid是随机的一个主键,所有不发sql也知道主键的值)
六,flush
工作:1,清理缓存;2,执行sql
什么时候执行:1,commit;2,调用flush();3,执行查询前(如,iterator)
七,lazy
可以使用的范围:
1,<class>标签上 取值:true /false
只对普通属性起作用
2,<property>标签上(需要类增强工具 ) 取值:true/false
3,<set><list>标签上 取值:true /false/extra
extra:比较智能的发sql语句
4,<one-to-one><many-to-one>单端关联上 取值:false/proxy /noproxy (需要类增强工具 )