hibernatejava中的会话和事务

hibernatejava中的会话和事务,java,hibernate,session,transactions,Java,Hibernate,Session,Transactions,在Java Hibernate中,当我们需要对DB执行某些操作时,我们需要: 1.公开会议 2.开始交易 3.完成交易 4.闭门会议 例如,如果我想获得学生名单: public static List<Student> getStudentList() { List<Student> l = null; Session session = HibernateUtil.getSessionFactory().openSession(); try {

在Java Hibernate中,当我们需要对DB执行某些操作时,我们需要: 1.公开会议 2.开始交易 3.完成交易 4.闭门会议

  • 例如,如果我想获得学生名单:

    public static List<Student> getStudentList() 
    {
       List<Student> l = null;
       Session session = HibernateUtil.getSessionFactory().openSession();
       try {
           String hql = "from Student";
           Query query = session.createQuery(hql);
           l = query.list();
       } catch (HibernateException ex) {
           //Log the exception
           System.err.println(ex);
       } finally {
           session.close();
       }
       return l;
    }
    
为什么getStudentList()中没有事务?提前感谢

此hibernate解释了事务中未显式执行的选择操作的行为

本文给出了以下示例,但对于您的查询示例也是如此

Session Session=sessionFactory.openSession()
会话.get(Item.class,123l)
session.close()

  • 将打开一个新会话。此时它没有获得数据库连接
  • 对get()的调用触发SQL选择。会话现在从连接池获得JDBC连接。默认情况下,Hibernate使用setAutoCommit(false)立即关闭此连接上的自动提交模式。这将有效地启动JDBC事务
  • SELECT在这个JDBC事务中执行。会话关闭,连接返回到池中,并由JDBC连接上的Hibernate-Hibernate调用close()释放。未提交的事务会发生什么情况
  • 这个问题的答案是,“这要看情况而定!”当对连接调用close()时,JDBC规范没有说明任何挂起的事务。发生的情况取决于供应商如何实现规范。例如,对于Oracle JDBC驱动程序,对close()的调用提交事务!当JDBC连接对象关闭并且资源返回到池中时,大多数其他JDBC供应商采用相同的路径并回滚任何挂起的事务。 显然,这对SELECT[…]不会有问题

    让我们扩展上面的示例来引发一个可能的问题

    Session session = sessionFactory.openSession();
    Item item = session.get(Item.class, 123l);
    item.setPrice(10);
    session.close();
    
    现在,它取决于JDBC驱动程序是否保存了
    项的新价格

    因此,您可以忽略纯
    SELECT
    操作上的开始和提交事务,即使您的JDBC驱动程序将回滚事务,只要您没有数据库更改

    但无论如何,我强烈建议在任何操作中使用事务,以避免误解和问题

    Session session = sessionFactory.openSession();
    Item item = session.get(Item.class, 123l);
    item.setPrice(10);
    session.close();