坚持对象生命周期,Update难点总括

作者: 今晚开什么码  发布:2019-11-04

首先回顾一下Hibernate的对象状态。

数据库隔离级别

1、Read Uncommited(未提交读):没有提交就可以读取到数据(发出了Insert,但没有commit就可以读取到。)很少用

2、Read Commited(提交读):只有提交后才可以读,常用

3、Repeatable Read(可重复读):mysql默认级别, 必需提交才能见到,读取数据时数据被锁住

4、Serialiazble(序列化读):最高隔离级别,串型的,你操作完了,我才可以操作,并发性特别不好

脏读:没有提交就可以读取到数据称为脏读

不可重复读:再重复读一次,数据与你上的不一样。称不可重复读

幻读:在查询某一条件的数据,开始查询的后,别人又加入或删除些数据,再读取时与原来的数据不一样了

     1、瞬时对象(Transient Objects):

持久化对象的状态:

1、瞬时对象(Transient Object):使用new操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收

2、持久化对象(Persistent Object):持久实例是任何具有数据库标识的实例,它由持久化管理器Session统一管理,持久实例是在事务中进行操作的----它们的状态在事务结束时同数据库进行同步。当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中

3、离线对象(Detached Object):Session关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,不再受hibernate管理

Transient对象:随时可能被垃圾回收器回收(在数据库中没有于之对应的记录,是new初始化),没有纳入session的管理,而执行save()方法后,就变为Persistent对象(持久性对象)

Persistent对象:在数据库中有存在的对应的记录,纳入session管理。在清理缓存(脏数据检查)的时候,会和数据库同步

Detached对象:也可能被垃圾回收器回收掉(数据库中存在对应的记录,只是没有任何对象引用它是指session引用),没有纳入session的管理

 

 

     使用new操作符初始化的对象不是立刻持久的。的状态是瞬时的,也就说没有和任何数据库表进行关联。只要应用不再引用这对象,他的状态将丢失,并且由垃圾回收机制回收。数据库中没有此对象,只是存在内存中。

     2、持久对象(Persist Objects):持久对象是具有数据库标识的,也就是从数据库获取来的。他有持久化管理器Session统一管理,持久实例实在事务中进行操作--当事 务结束他的状态与数据库同步,可以这样理解当我们在对象处于Persist 状态时候我们对对象的改变将会同步道数据库中,其原理是当事务提交时刻,提供执行SQL的i(DML)nsert 、update、delete语句把内存中的状态同步到数据库中。

     3、脱管对象、游离状态(Detached Objects):Session关闭之后,持久化对象变成离线对象,离线对象就不能同数据库同步,也不再受Hibernate管理。此时数据库中还存在这个对象,只是没有纳入Session管理。

图片 1

  eclipse 生成DAO代码与状态的关系:

  1.saveOrUpdate(Instance) 操作临时、脱管对象,然后对象变成持久状态

  2. lock(detachedInstance) 操作干净的脱管状态对象,然后对象变成持久状态

  3. merge(detachedInstance) 操作脱管状态对象,然后对象变成持久状态

  4. attachDirty(instance) 操作不干净的临时、游离对象

  5. attachClean(detachedInstance)操作脏脱管对象

—————————————————————————————————————————————————————————————————————————————————  

遇到的问题:MyEclipse自动生成的DAO类没有添加事物管理,不能更新数据。

解决的办法:例如在attachDirty()方法中添加事物管理。

public void attachDirty(UserTable instance) {
        log.debug("attaching dirty UserTable instance");
        try {
            Session session = getSession();
            Transaction tx = session.beginTransaction();
            session.saveOrUpdate(instance);
            tx.commit();
            session.close();
            log.debug("attach successful");
        } catch (RuntimeException re) {
            log.error("attach failed", re);
            throw re;
        }
    }

思考:session会在方法执行完后自动关闭。使用JTA取代JDBC的事务管理,可以实现跨session的事物管理。(注:JTA :java transaction api ->I need to learn from it!!!)

还有没有更好的解决方法呢?!

图片 2

本文由今晚开什么码发布于今晚开什么码,转载请注明出处:坚持对象生命周期,Update难点总括

关键词:

上一篇:没有了
下一篇:没有了