• 阅读Hibernate框架Session接口的源码的笔记


    一、阅读Session接口的注释的理解。(看着注释翻译的,有些地方可能翻译的不太对,有疑问再看源文档)

    ①、Session的生命周期随着事务开始而开始,事务的结束而结束。

    附原文:The lifecycle of a <tt>Session</tt> is bounded by the beginning and end of a logical transaction. (Long transactions might span several database transactions.)

    ②、Session的主要方法提供了对对象的增删改查操作,对象可能存在三种状态:临时状态(transient)、持久化状态(persistent)、游离状态(detached)

      临时状态:没有持久化、没有和任何Session关联(附原文:never persistent, not associated with any <tt>Session</tt><br>)

      持久化状态:与一个唯一的Session关联(associated with a unique <tt>Session</tt><br>)

      游离状态:之前是与Session关联的,但是现在已经脱离Session的管理,没有与任何Session关联(previously persistent, not associated with any <tt>Session</tt><br>)

    ③、1.临时状态的对象可能会在调用save()、persist()、saveOrUpdate()这几个方法后被持久化。

           2.持久化状态的对象可能在调用delete()方法后变成临时状态。

      3.get()、load()方法返回的对象都是持久化状态。

           4.游离状态的对象可能会在调用update()、saveOrUpdate()、lock()、replicate()这几个方法后被持久化

    ④、临时状态或游离状态的对象在调用merge()方法后可能会被固化为一个新的持久化对象。

    ⑤、save()、persist()方法会导致发送一个INSERT语句;delete()方法会导致发送一个DELETE语句;update()、merge()方法会导致发送一个UPDATE语句;

      在清除缓存的时候发现一个持久化对象发生改变会发送一条UPDATE语句。调用saveOrUpdate()或replicate()将会导致发送一条INSERT语句或者UPDATE语句。

    ⑥、每个线程/事务都应该从SessionFactory中获得它自己的实例。

    ⑦、如果一个Session的持久化类是可序列化的那么这个Session也是可序列化的。

    ⑧、如果Session抛出异常,那么事务必须回滚,并且抛弃Session。当异常发生后,Session的内部状态可能与数据不一样。

    ------------------------------------------------分割线------------------------------------------------------

    二、阅读一些方法

    public void flush() throws HibernateException;

    一)、

      清除session缓存。

      ①、在完成一些工作后,在提交事务和关闭session之前,必须要调用flush()方法。

      ②、<i>Flushing</i> is the process of synchronizing the underlying persistent store with persistable state held in memory.(暂时不能将其翻译通顺)

    二)、public SessionFactory getSessionFactory();

      获取创建这个session的SessionFactory。

    三)、public Connection close() throws HibernateException;

      通过释放JDBC连接和清理来结束这个session

    四)、public Serializable getIdentifier(Object object);

      返回给定对象的ID(identifier),如果这个对象处于临时状态或者游离状态那么就会抛出异常。

    五)、public boolean contains(Object object);

      检查给定的对象是否与session关联。

    六)、public void evict(Object object);

      将对象从session缓存中移除。这个时候对象将不与数据库中的同步了。(后面的不懂翻译)This operation cascades to associated instances if the association is mapped with <tt>cascade="evict"</tt>.

    七)、public Object load(Class theClass, Serializable id);

      load()方法有好多个重载的方法。这里只列举一个

      ①、用给定的id和对象的类型加载一个类持久化对象。

      ②、不能使用这个方法来判断一个对象是否存在,可以使用get()方法代替

    八)、public void replicate(Object object, ReplicationMode replicationMode);

      重新使用当前id将游离状态下的对象持久化。

    九)、public Serializable save(Object object);

      将一个临时状态的对象持久化,设定id。如果在映射文件中将<id>标签中的<generator>标签的 class属性设为"assigned" 。那么id就使用当前临时状态对象的id值。

    十)、public void saveOrUpdate(Object object);

      不懂翻译通顺

      Either {@link #save(Object)} or {@link #update(Object)} the given instance, depending upon resolution of the unsaved-value checks (see the manual for discussion of unsaved-value checking).<p/> This operation cascades to associated instances if the association is mapped with {@code cascade="save-update"}

    十一)、public void update(Object object);

      将一个游离状态的对象持久化,id设为游离状态对象的ID,但是如果有一个持久化对象的id和这个游离状态的id相同,那么就会抛出异常

    十二)、public Object merge(Object object);

    之后继续更新

  • 相关阅读:
    java文件的读写程序代码
    C#多线程总结
    动态调用WebService接口的几种方式
    Net中Attribute特性的高级使用及自定义验证实现
    进程、线程、多线程
    C#设计模式之单例模式
    C# HttpClient 请求转发
    webapi Model Validation 模型验证
    加密解密方法
    手把手教Electron+vue的使用
  • 原文地址:https://www.cnblogs.com/GooPolaris/p/7920031.html
Copyright © 2020-2023  润新知