zoukankan      html  css  js  c++  java
  • Struts2+Hibernate Update问题小结

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

         1、瞬时对象(Transient Objects):

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

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

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

      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!!!

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



  • 相关阅读:
    Asp.net中利用ExecuteNonQuery()执行存储过程返回1解决方案
    在workflow中,无法为实例 ID“...”传递接口类型“...”上的事件“...” 问题的解决方法。
    jquery获取一个table中的一行的每个td的内容
    自动ping博客服务程序
    总结JavaScript(Iframe、window.open、window.showModalDialog)父窗口与子窗口之间的操作
    sql server try...catch使用
    IAsyncResult异步设计
    jquery 判断一个对象是否存在
    数据库表扩展字段设计思路
    REST接口POST方法发送文件到服务器(C#)
  • 原文地址:https://www.cnblogs.com/flyoung2008/p/2190382.html
Copyright © 2011-2022 走看看