hibernate
Hibernate中get和load有什么不同之处?
get和load的最大区别是,如果在缓存中没有找到相应的对象,get将会直接访问数据库并返回一个完全初始化好的对象,而这个过程有可能会涉及到多个数据库调用;
而load方法在缓存中没有发现对象的情况下,只会返回一个代理对象,只有在对象getId()之外的其它方法被调用时才会真正去访问数据库,这样就能在某些情况下大幅度提高性能。
Hibernate中save、persist和saveOrUpdate这三个方法的不同之处
save()只能INSERT记录
saveOrUpdate()可以进行insert和update
save()的返回值是一个Serializable对象,而persist()方法返回值为void。
Hibernate中的SessionFactory有什么作用? SessionFactory是线程安全的吗?
SessionFactory就是一个用于创建Hibernate的Session对象的工厂。SessionFactory通常是在应用启动时创建好的,应用程序中的代码用它来获得Session对象。
作为一个单个的数据存储,它也是 线程安全的,所以多个线程可同时使用同一个SessionFactory。
Java JEE应用一般只有一个SessionFactory,服务于客户请求的各线程都通过这个工厂来获得Hibernate的Session实例
这也是为什么SessionFactory接口的实现必须是线程安全的原因。
Hibernate中的Session指的是什么? 可否将单个的Session在多个线程间进行共享?
Session代表着Hibernate所做的一小部分工作,它负责维护者同数据库的链接而且不是线程安全的,
Hibernate中的Session不能在多个线程间进行共享。虽然Session会以主动滞后的方式获得数据库连接,但是Session最好还是在用完之后立即将其关闭。
hibernate中sorted collection和ordered collection有什么不同?
sorted collection是通过使用 Java的Comparator在内存中进行排序的,
ordered collection中的排序用的是数据库的order by子句。
对于比较大的数据集,为了避免在内存中对它们进行排序而出现 Java中的OutOfMemoryError,最好使用ordered collection。
Hibernate中transient、persistent、detached对象三者之间有什么区别?
在Hibernate中,对象具有三种状态:transient、persistent和detached。
同Hibernate的session有关联的对象是persistent对象。对这种对象进行的所有修改都会按照事先设定的刷新策略,反映到数据库之中,可以在对象的任何一个属性发生改变时自动刷新,也可以通过调用Session.flush()方法显式地进行刷新。
如果一个对象原来同Session有关联关系,但当下却没有关联关系了,这样的对象就是detached的对象。你可以通过调用任意一个session的update()或者saveOrUpdate()方法,重新将该detached对象同相应的seesion建立关联关系。
Transient对象指的是新建的持久化类的实例,它还从未同Hibernate的任何Session有过关联关系。同样的,你可以调用persist()或者save()方法,将transient对象变成persistent对象。
为什么在Hibernate的实体类中要提供一个无参数的构造器这一点非常重要?
每个Hibernate实体类必须包含一个 无参数的构造器, 这是因为Hibernate框架要使用Reflection API,通过调用Class.newInstance()来创建这些实体类的实例。如果在实体类中找不到无参数的构造器,这个方法就会抛出一个InstantiationException异常。
Hibernate中二级缓存指的是什么?
二级缓存是在SessionFactory这个级别维护的缓存,它能够通过节省几番数据库调用往返来提高性能。二级缓存是针对整个应用而不是某个特定的session的。
Hibernate中的查询缓存指的是什么?
查询缓存实际上保存的是sql查询的结果,这样再进行相同的sql查询就可以之间从缓存中拿到结果了。
为了改善性能,查询缓存可以同二级缓存一起来使用。