hibernate相关

hibernate实体的三种状态
1、瞬时状态(Transient):

通过直接new创建
只在内存中存在,与数据库无关
在数据库中没有记录,和session也没有任何的关联

2、持久状态(Persistent):

内存中存在,,数据库中也存在
该实体对象被Hibernate框架管理,与session相关联
Hibernate会依据持久状态对象的属性变化而改变数据库中相对应的记录

3、游离状态(Detached):

内存中存在,数据库中不一定存在
游离态是由持久对象转变而来的,当不再与session关联时就变成了游离态
本质上和瞬时对象相同,只是比瞬时对象多了一个数据库记录
对游离对象所做的修改将不会影响到到数据库中的数据

因为对应的数据库数据可能会被其他事务所删除,所以在数据库中不一定存在。

举例说明

UserEntity user = new UserEntity();//直接new出来的对象此时是瞬时状态
        Session session = HSession.getSession();
        Transaction tr = session.getTransaction();
        tr.begin();

        user = session.get(UserEntity.class,"4028e58470e154e00170e154e3530000");//通过与数据库的连接将对象从瞬时状态改变为持久状态,此时对改对象进行修改等操作,hibernate会同样修改数据库中的数据
        user.setName("用户A");//对对象的第一次修改
        user.setName("用户B");//对对象的第二次修改

        tr.commit();
        session.close();//提交事务并关闭连接后,断开了与session的关联,此时的对象从持久状态转化为了游离状态,此时仍然可以对该对象进行修改,但是并不会影响到数据库中的数据
        user.setName("用户C");//对对象的第三次修改

但是hibernate对数据库中的数据实际执行了几次修改呢?
因为要对数据库中的数据进行修改,所以要看对象处于持久状态的进行的操作,所以第三次修改不会算入。

hibernate中有一级缓存和二级缓存,其中一级缓存就是session对象,从数据库读取到的数据,实际是保存在一级缓存中的,进行修改时也是对一级缓存中的对象进行修改,当事务提交时,再由一级缓存读取对象对数据库进行修改。所以只会在提交事务的时候对数据库进行一次修改,可以在hibernate的配置文件中加入<property name="show_sql">true</property>来在控制台中查看hibernate对数据库进行的操作。

懒加载和急加载

懒加载(FatchType.LAZY,延迟加载):在加载一个实体的时候,不会马上从数据库中加载,在调用时才从数据库中加载到内存。

急加载(FatceType.EAGER,立即加载):在加载一个实体时,会立即从数据库中查询,与其关联的类也会被同时查询。

在当前session关闭以后访问由load()加载的对象的非id属性时,由于session已经关闭,程序会弹出NO SESSION异常。
原因是懒加载load方法只会加载id属性,所有的非id属性的访问操作都不会执行。一级缓存中保存的只是id属性,需要使用其他属性时再通过当前session进行查询,所以会有异常。
使用急加载get方法会加载该实体的所有属性并且保存到一级缓存中,所以即使session关闭了,由于查询的是一级缓存中保存的实体对象,所以也不会影响到对其他属性的查询。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值