Hibernate问题总结
Hibernate问题总结
1、 合理选择list(放而不取)和iterate(放且取,先取所有数据的ID值,再根据ID值去查询相应数据,并把取出的数据放于二级缓存中,但是先去缓存中找,再查数据库)方法,充分利用二级缓存;如果缓存中没有数据,则iterate方法的效率很低,因为要发出1+N条查询语句,而list每次只会发出一条查询语句;
2、 一对多中,对对象的关联集合属性进行二级缓存;
3、 一对多中,可以合理利用迫切查询来针对懒加载的弊端;
4、 检索时,推荐用HQL,因为HQL很灵活,并且可读性很好,并能重载配置文件中的数据获取(fetch)方式。对HQL、QBC和SQL的使用,推荐顺序:HQL->QBC->SQL;
5、 HQL可以使用连接查询,可以实现多态查询;
6、 多对多=>拆分成两个一对多(注意单双向的实际意义);
7、 一对多可以实现表的自连接(主键和外键都在一张表上);
8、 组件映射(细粒度的对象属性,讲一个实体类拆分成几个小的实体类,但是仍然只用一张表映射);
9、 命名的HQL,在hibernate的配置文件中配置;
10、 本地纯粹的SQL语句(尽量少用);
11、 无论是QBC还是HQL,都可以只查询表中的某一个字段的数据(返回相应的数据类型),也可以查询某几个字段的数据(返回一个Object类型的数组);
12、 动态更新(dynamic-update)只是更新改变了的对象属性,对没有改变的对象属性,在底层的SQL语句中不做update操作;
13、 动态插入(dynamic-insert)只是插入已经赋值的对象属性,对于没有赋值的对象属性,,在底层的SQL语句中不做insert操作;
14、 解决由于懒加载(lazy)而造成的异常,可以用Hibernate.initialize()方法对相应的对象进行初始化,也可以用Query的迫切查询HQL进行查询,还可以用OpenSessionInView设计模式,不推荐将lazy设为false;
15、 在注解方式配置一对多或多对多双向关联中,必设mappedBy属性,相当于XML文件中的inverse属性,设置有哪一方维持关联关系;
16、 注意:其实hibernate中的实体类对象就是通过数据库表中已有的数据构造的,其实数据库表中的数据与hibernate并无什么关系,只不过是hibernate将数据封装成对象罢了,所以数据库表中的数据与hibernate中的什么实体类、什么多态查询、什么继承关联、一对多、多对多等等没有什么紧密的关系,是分离的。所有的这些关联关系在数据库表上无非就是几个外键的关联罢了,但是在hibernate中却被封装成了类与类之间的组合关系;