Hibernate之Session方法

2019-09-29  本文已影响0人  紫荆秋雪_文

一、Session中方法

1、开启一个事务:
Transaction beginTransaction()
2、获取一个事务:
Transaction getTransaction()
3、保存一个对象:
Serializable save(Object o)
4、修改一个对象:
void update(Object o)
5、删除一个对象:
void delete(Object o)
6、根据主键查询指定类型的对象:
Object get(Class type,Serializable id)
7、根据hql创建一个查询对象
Query createQuery(String hql)
8、关闭Session:
void close()
9、清除一级缓存所有对象:
void clear()
10、清除一级缓存中制定的对象:
void evict(Object o)

1、事务相关的方法

2、一级缓存相关

3、持久化操作相关:

4、持久化方法

在Hibernate中persist和方法save方法都表示保存一个对象

    public void save(User user) {
        Session session = HibernateUtil.getHibernateSession();
        //5、设置事务的开启状态
//        session.beginTransaction();
        //6、具体操作
        session.save(user);
        //7、提交事务
//        session.getTransaction().commit();
    }
Hibernate: 
    insert 
    into
        t_user
        (name, date) 
    values
        (?, ?)
    public void save(User user) {
        Session session = HibernateUtil.getHibernateSession();
        //5、设置事务的开启状态
//        session.beginTransaction();
        //6、具体操作
//        session.save(user);
        session.persist(user);
        //7、提交事务
//        session.getTransaction().commit();
    }

5、保存或更新方法:

session.saveOrUpdate(Object en):如果对象之前没有存储到数据库,则保存,如果已经保存过,则更新。

    public void saveOrUpdate(User user) {
        Session session = HibernateUtil.getHibernateSession();
        session.saveOrUpdate(user);
    }
Hibernate: 
    insert 
    into
        t_user
        (name, date) 
    values
        (?, ?)
    public void saveOrUpdate(User user) {
        Session session = HibernateUtil.getHibernateSession();
        session.beginTransaction();
        session.saveOrUpdate(user);
        session.getTransaction().commit();
    }
Hibernate: 
    insert 
    into
        t_user
        (name, date) 
    values
        (?, ?)
Hibernate: 
    update
        t_user 
    set
        name=?,
        date=? 
    where
        id=?
    public void saveOrUpdate(User user) {
        Session session = HibernateUtil.getHibernateSession();
        session.merge(user);
    }

存在OID:发送SELECT语句,没有发送UPDATE语句

Hibernate: 
    select
        user0_.id as id1_0_0_,
        user0_.name as name2_0_0_,
        user0_.date as date3_0_0_ 
    from
        t_user user0_ 
    where
        user0_.id=?
    public void saveOrUpdate(User user) {
        Session session = HibernateUtil.getHibernateSession();
        session.beginTransaction();
        session.merge(user);
        session.getTransaction().commit();
    }
Hibernate: 
    insert 
    into
        t_user
        (name, date) 
    values
        (?, ?)

存在OID:发送SELECT语句,发送UPDATE语句

Hibernate: 
    select
        user0_.id as id1_0_0_,
        user0_.name as name2_0_0_,
        user0_.date as date3_0_0_ 
    from
        t_user user0_ 
    where
        user0_.id=?
Hibernate: 
    update
        t_user 
    set
        name=?,
        date=? 
    where
        id=?

6、get和load方法

get方法返回的总是持久化状态的对象;get方法立刻发送一条SELECT语句,结果可以用if-null来判断对象是否为空
load方法并不会立刻发送一条SELECT语句去查询对象,而要到了真正在使用一个非主键属性的时候,才会去发送SELECT语句,我们把这种方式叫做延迟加载(lazy-load)/ 懒加载

二、持久化对象生命周期

1、状态

问题1:主键生成策略不同,save操作时发生INSERT语句的时机不同

2、对象的四种状态

1、临时状态/瞬时态(transient):刚刚用new语句创建,没有被持久化(save),不处于session中。特点:没有OID,不在session缓存中
2、持久化状态(persistent):已经被持久化,加入到session的缓存中。特点:有oid,在session的一级缓存中
3、脱管状态/游离状态(detached):已经被持久化,但不处于session中。特点:有oid,不在session中
4、删除状态(removed):对象有关联的ID,并且在session管理下,但是已经计划被删除。特点:有oid,在session缓存中,最终被删除

状态一:临时状态

状态二:删除状态

状态三:持久化状态

状态四:游离状态

三、对象状态总结

问题1: 主键生成策略不同,save操作时发送INSERT语句的时机不同.

native:执行save方法的时候就立刻发送INSERT语句.
increment:执行save方法的时候没有发送INSERT语句,而是在提交事务时发送.

临时状态--->持久化状态:从没有OID变的有OID了,过程中会想尽方式获取一个OID值并设置在对象上.
native方式,是数据库自增的方式,只有执行INSERT语句,才能获取自动生成的主键(OID).

increment方式:是Hibernate的自增方式,会先发送SELECT  MAX(主键) FROM 表,递增1之后,
就是这一次保存的OID值.此时不需要执行INSERT语句,就可以获取OID,所以并没有立刻发送INSERT语句.
INSERT语句是提交事务的时候,才发送的.

问题2: 删除对象的时候,没有立刻发生DELETE语句,而是在提交事务的时候发送的.

因为delete方法仅仅表示把游离状态对象/持久化状态对象变成删除状态,不负责发送SQL.

问题3: 为什么在事务环境下,通过get方法得到的对象,只要修改了非IOD属性值,会发生UPDATE语句.

引入一级缓存的快照区.
  当把通过get方法查询出一个对象的时候,该对象同时存储在一级缓存中,也同时存储在session的快照区.
  在通过修改了对象的非IOD属性.(p.setName(“XXX”)),此时就把一级缓存中数据改变了.
  默认情况下,在事物提交的时候,就会去检查一级缓存中数据和快照区数据是否一致,如果不一致,
就发送UPDATE语句把一级缓存中的数据同步到数据库.

四、发送SQL的时机

默认情况下,在事务提交时,会自动去数据库同步这一次对象变化对应的SQL,事务提交的时候,发送什么SQL?

上一篇 下一篇

猜你喜欢

热点阅读