假设有一个类,它有两个属性property1和 property2,则HQL语句"from A as a left outer join a.property1"有一个原则,HQL语句忽略配置文件中的预先抓取策略,这句话有两个意思:
不管A类对property1在配置文件里是什么策略,(可能是预先抓取,立即或延迟检索,它们都失效),这时都采用HQL指定的左外连接;左外连接必定会初始化property1属性(或对象),但是如果配置文件里对property1的检索策略是延迟加载,A类得不到对property1的引用,为了得到这个引用,需要再次发送一条SQL语句来确立这种引用关系,这种情况在property1为集合时经常出现.
A类在配置文件中设置的对property2的预先抓取策略将被忽略(不管这个策略是fetch或是select),对propery2有影响的设置是立即和延迟加载,hibernate只看得到这两种策略.所以在使用语句"from A as a left outer join a.property1"时,property2的加载策略将仅由lazy=true或者是lazy=false来决定
在配置文件中设置的检索策略只能影响到session.get()或load()方法,对于使用"Query q = session.createQuery(from A as a left outer join a.property1)"这种指明HQL的方式,将忽略配置文件的预先抓取检索策略
在"from team t left outer join t.students"语句中,team和students对象配置文件中的预先抓取都将被忽略,因此,HQL忽略配置文件预先抓取策略深度就是在HQL语句中指定的对象,Hibernate对这些对象直接的属性配置忽略预先抓取,而采用立即或是延迟检索的策略,假设身份证还关联其他对象,则这些对象的抓取策略按照配置文件的设定,预先抓取策略不会被忽略,Hibernate仅在第一层关联时忽略配置文件的预先抓取,在更深的层次,按照配置文件设置的策略取得对象
在进行批量操作时(包括更新,删除),最好的方法是调用JDBC的API进行操作