通过设置属性lazy进行设置是否需要懒加载。当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。
Hibernate 常用的缓存有一级缓存和二级缓存:
一级缓存:也叫 Session 缓存,只在 Session 作用范围内有效,不需要用户干涉,由 hibernate 自身维护,可以通过:evict(object)清除 object 的缓存;clear()清除一级缓存中的所有缓存;flush()刷出缓存;
二级缓存:应用级别的缓存,在所有 Session 中都有效,支持配置第三方的缓存,如:EhCache。
通过配置文件中的many-to-one、one-to-many、many-to-many来实现类之间的关联关系的。
可以将Hibernate的实体类定义为final类,但不建议这么做。因为Hibernate会使用代理模式在延迟关联的情况下提高性能,如果你把实体类定义成final类之后,因为 Java不允许对final类进行扩展,所以Hibernate就无法再使用代理了,如此一来就限制了使用可以提升性能的手段。
Integer 类型为对象,它的值允许为 null,而 int 属于基础数据类型,值不能为 null。
Hibernate框架会调用这个默认构造方法来构造实例对象,即Class类的newInstance方法 ,这个方法就是通过调用默认构造方法来创建实例对象的 。如果在实体类中找不到无参数的构造器,这个方法就会抛出一个InstantiationException异常。
Hibernate在做插入操作时会把要操作的对象全部放到自身的内部缓存来进行管理。当海量数据插入的时候,会有很多对象被纳入内部缓存,就可能出现OutOfMemoryError(内存溢出异常),因此最好做到如下三点:
1.做海量数据批量操作一定要关闭控制台显示执行的sql语句;
2.绕过Hibernate API ,直接通过 JDBC API 来做,这个方法性能上是比较好的,也是最快的;
3.如果还是使用Hibernate API ,使用分段插入。
1)HQL优化
2)API的正确使用(如根据不同的业务类型选用不同的集合及查询API)
3)主配置参数(日志,查询缓存,fetch_size, batch_size等)
4)映射文件优化(ID生成策略,二级缓存,延迟加载,关联优化)
5)一级缓存的管理
6)针对二级缓存,还有许多特有的策略