hibernate知识点点滴滴
Session中的查询
//用到才会去数据库查数据 它的值会去hibernate中的session的二级缓存里去找,如果找不到目则会laxy load一下,简单来说,Dbforum f = (Dbforum) session.load(Dbforum.class, 6);//一次取出数据,前两者在关联表的数据,都是用到才会查数据库取。用get的时候,当为空的时候不会抛出异常,反之load会抛.?Dbforum f = (Dbforum) s.get(Dbforum.class, 6);
?
cascade级联
Group getUsers() cascadeType.ALL
取Group时,关联的User全取出来。
设置双向的关联,保存时也要在程序中设置关联,
对于保存也会级联保存。
?
/** * * fetch=FetchType.EAGER拿父亲节点,孩子节点都拿出来 * cascade=CascadeType.ALL级联更新 */ @OneToMany(mappedBy="parent",cascade=CascadeType.ALL) public Set<Org> getChildren() { return children; }
fetch属性对get,load有影响。
?
?
对象的三种状态
(关键在于:有没有id,id在数据库中有没有,在内存中有没有【Session缓存】)
Transient: new出来的新对象,没有id
(内存中的对象,没有id,缓存没有)
Persistent:Transient对象save后有id了,保存后的对象
(内存中有,缓存中有,有id,数据库有)
Detached:session关闭后的对象
(内存有,缓存(Session)没有,数据库有,有id)
/** * Transient(瞬时态): new出来的新对象,没有id。是对象是创建时,瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系,在Hibernate中,可通过session的save()或 saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成持久化对象。? */ Dbforum f = new Dbforum(); f.setFname("感情世界"); Session s = sessionFactory.openSession(); s.save(f); /** * Persistent(持久态):Transient对象save后有id了,保存后的对象。是该对象在数据库中已有对应的记录,并拥有一个持久化标识,如果是用hibernate的delete()方法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联。???? 当一个session执行close()或clear()、evict()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在hibernate持久层的管理之下。?? 持久对象具有如下特点:????? 1. 和session实例关联;????? 2. 在数据库中有与之关联的记录。? */ System.out.println(f.getFid()); s.beginTransaction().commit(); /** * Detached(托管态):session关闭后的对象。当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session上时,并再次转变成持久对象。??????? 脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象。??????? 脱管对象具有如下特点:?? 1.本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;?2. 比瞬时对象多了一个数据库记录标识值。? */ System.out.println(f.getFid());
?
? ?save 和update区别?
答: save是把一个对象做为一个新的数据保存, update则是把一个脱管状态的对象或自由态对象(一定要和一个记录对应)更新到数据库,其实一个是保存一个是更新,一看都知道是有什么区别了。?
? update 和saveOrUpdate区别?
答:这个是比较好理解的,顾名思义,saveOrUpdate基本上就是合成了save和update,而update只是update;引用hibernate reference中的一段话来解释他们的使用场合和区别?
通常下面的场景会使用update()或saveOrUpdate():?
程序在第一个session中加载对象,接着把session关闭?
该对象被传递到表现层?
对象发生了一些改动?
该对象被返回到业务逻辑层最终到持久层?
程序创建第二session调用第二个session的update()方法持久这些改动?
saveOrUpdate(po)做下面的事:?
如果该po对象已经在本session中持久化了,在本session中执行saveOrUpdate不做任何事?
如果savaOrUpdate(新po)与另一个与本session关联的po对象拥有相同的持久化标识(identifier),抛出一个异常?
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [org.itfuture.www.po.Xtyhb#5]?
saveOrUpdate如果对象没有持久化标识(identifier)属性,对其调用save() ,否则update() 这个对象??????
? flush和update区别?
答:这两个的区别好理解update操作的是在自由态或脱管状态(因session的关闭而处于脱管状态)的对象//updateSQL?
而flush是操作的在持久状态的对象。?
默认情况下,一个持久状态的对象的改动(包含set容器)是不需要update的,只要你更改了对象的值,等待hibernate flush就自动更新或保存到数据库了。hibernate flush发生在以下几种情况中:?
1, 调用某些查询的和手动flush(),session的关闭、SessionFactory关闭结合?
get()一个对象,把对象的属性进行改变,把资源关闭。?
2,transaction commit的时候(包含了flush)
?
Hibernate缓存
一级缓存:session缓存,
二级缓存:sessionFactory级别的缓存
适用:经常被访问、改动不大不会经常被改动、数量有限
相同的查询语句执行一次。
查询缓存:查询语句相同的时候起作用,依赖于二级缓存。
?
缓存算法
LRU Least Recently Used 最近很少使用
LFU Least Frequently Used 最近不常被使用(命中率低)
FIFO First In First Out
memoryStoreEvictionPolicy=
二级缓存配置
1、hibernate.cfg.xml
<property name="cache.use_second_level_cache">true</property>
? ?? ???<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
2、导入jar包
hibernate自带的缓存接口
Apache的Commons-logging jar包
?
3、Entity类上面添加如下注解
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
?
?
?