zhangjianhua4089 2009-11-04 23:45
浏览 195
已采纳

springside 删除数据库的记录的疑义

在研究SpingSide  Hibernate  DAO层。对数据的操作时发现了一个非常奇怪的问题。

我通过一个java 的主程序 main() 方法 去调用HibernateDao()里的删除方法。console 控制台只有查询出对象的操作,没有输出删除的操作。程序这样操作的。

主程序 main() 方法这样定义

SessionFactory sf2 = new Configuration().configure().buildSessionFactory();
HibernateDao hd = new HibernateDao(sf2,Test.class);
hd.delete(6); //6 是test 表里的id主键。

在HibernateDao 继承了SimpleHibernateDao类,在simpleHibernateDAO中 delete()方法抵用get(id) 获取这个对象,然后传入delete(final T entity)对象的删除操作。这个删除的方法是这样定义的。

Assert.notNull(entity, "entity不能为空");
Transaction tx = this.getSession().beginTransaction();
this.getSession().delete(entity);
tx.commit();
this.getSession().close();
logger.debug("delete entity: {}", entity);

程序运行控制台不报错误。但是却没有输出Hibernate的删除的sql语句。

我把出现的问题放到getSession() 中获得的session 是否是主程序传递过来的SessionFactory。

getSeesion的方法是这样定义的。

this.session=this.sessionFactory.openSession();
return this.session;

测试sessionFactory 就是主程序 SessionFactory sf2 = new Configuration().configure().buildSessionFactory(); 就是传递过来的sessionFactory。

查看simpleHibernateDAO的构造函数

public SimpleHibernateDao(SessionFactory sessionFactory, final Class entityClass) {
this.sessionFactory = sessionFactory;
this.entityClass = entityClass;
//this.session =sessionFactory.openSession();
}
也很正常,没有错误。

于是我在SimpleHibernateDao构造函数中最后一行加入this.session =sessionFactory.openSession();  不用getSession() 方法获取session,就可以执行删除操作了。

很奇怪,为什么这样就能删除对象呢。详细测试程序在附件中。


  • 写回答

1条回答 默认 最新

  • weixin_42519046 2009-11-05 08:39
    关注

    public void update(Object o){
    Session session=this.getSession();
    Transaction tx = session.beginTransaction();
    session.update(o);
    tx.commit();
    this.closeSession(session);
    }
    public void closeSession(){
    try
    {
    if(session!=null){
    session.close();
    session=null;
    }
    }catch(Exception ex)
    {
    ex.printStackTrace();
    }

    }
    你这么写试试

    Transaction tx = this.getSession().beginTransaction();
    this.getSession().delete(entity);
    tx.commit();
    this.getSession().close();

    你这个问题,首先this.getSession().beginTransaction(); 和this.getSession().delete(entity); 所获得的 Session对象不是一个对象,执行DELETE方法的那个session没有执行事务,所以运行不成功

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛