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)

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值