• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
My Blog@github像少年啦飞驰
{关注大规模数据处理(MapReduce)J2EE等技术}
博客园    首页    新随笔    联系   管理    订阅  订阅
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!!!)

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



作者:像少年啦飞驰
出处:http://www.cnblogs.com/flyoung2008/
Blog:http://www.flyoung.me
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
分享到: 更多
posted on 2011-09-25 18:54  像少年啦飞驰  阅读(1967)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3