hibernate的多态查询

Hibernate加载方式与多态加载分析:

1. Session中的load和get方法:
a) Load方法支持CGLIB lazy动态代理方式,所以加载的时候它会生成一个代理类.如果设置lazy为true 由于代理类不是真正的实例 无法用instenceof判断类的归属,所以它不支持多态加载.反之,如果把lazy设置为false那么就和get一样可以支持多态加载了.
b) Get方法默认不支持CGLIB lzay动态代理方式, 所以它加载的时候会直接产生一个真实的类.他是支持多态加载的.
注: load 和 get 方式ApI中所加载的实体的运行时类(Class<?>)是又两部分组成: 
1. 这个Class<?>运行时类对应的实体对象.
2. 与实体对象对应的映射文件.
所以,如果没有由这两个组成session会看作是不合法的参数,并抛出异常. 这就是它不会和Criteria方式加载(Object.class)类型的参数可以通过的根本原因. 
2. Query中的HQL接口:
HQL的查询方法说是通过对象查询的,但是经过分析, 它是根据配置文件来进行查询的,因为它定义查询语句的方式是根据映射文件中表的结构进行查询的. 所以,不同结构的映射文件中,同样的方法可能达到的效果是完全不一样的. 比如”From java.lang.Object”.
注: From java.lang.Object 是取出所有表中的所有数据,相当于链接全部表的字段.
3. Criteria对象查询接口:
顾名思义,Criteria是Hibernate的一套对象查询模式.但是它和HQL的本质是差不多的,也是通过配置文件来生成SQL语句. 所以不必过多的说了.

多态加载方面:
以上这些方法, 除了load方法的默认设置不支持多态加载之外,其他的形式都有一定程度上的支持. 但是表的结构一定要和映射文件中的一一对应才可以启用多态查询方式.

猜你喜欢

转载自zhangxing119.iteye.com/blog/1197255
今日推荐