hibernate 产生sql机制

一,基础知识

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 (需要类增强工具 )

 

你可能感兴趣的:(sql,Hibernate,工作)