没有有效的交易,保存无效

时间:2018-09-29 12:49:53

标签: java hibernate

如果我使用getCurrentSession()获取会话,并且我不开始交易并保存给出异常,但是当我使用openSession()获取会话时,则在相同情况下程序将无任何异常地运行。“ hibernate.current_session_context_class”是在休眠配置文件中用线程配置的。所以我使用getCurrentSession()和openSession()有什么区别。

Here is the code that gets session using getCurrentSession()-

            public static void main(String ar[])
            {

                SessionFactory sfac=null;

                sfac=new Configuration().configure("hibernateconfig/rs.xml")

                        .buildSessionFactory();

                try {

                Session session=sfac.getCurrentSession();
                Student stu=new Student();
                stu.setFirstName("abc23");
                stu.setLastName("xyz");
                System.out.println("-------------"+stu);
                session.save(stu);

                }
                catch(Exception e)
                {
                    System.out.println(e);
                }

            }

output-

-------------Student [id=0, firstName=abc23, lastName=xyz]
org.hibernate.HibernateException: save is not valid without active transaction


Here is the code that gets session using openSession()-

        public static void main(String ar[])
        {

            SessionFactory sfac=null;

            sfac=new Configuration().configure("hibernateconfig/rs.xml")

                    .buildSessionFactory();

            try {

            Session session=sfac.openSession();
            Student stu=new Student();
            stu.setFirstName("abc23");
            stu.setLastName("xyz");
            System.out.println("-------------"+stu);
            session.save(stu);

            }
            catch(Exception e)
            {
                System.out.println(e);
            }

        }


output-

-------------Student [id=0, firstName=abc23, lastName=xyz]
Hibernate: 
    insert 
    into
        student
        (firstName, lastName) 
    values
        (?, ?)

1 个答案:

答案 0 :(得分:1)

openSession():
调用 SessionFactory.openSession()时,它将始终创建新的Session对象并将其提供给您。您需要显式刷新并关闭这些会话对象。由于会话对象不是线程安全的,因此在多线程环境中,每个请求需要创建一个会话对象,而在Web应用程序中,每个请求也需要创建一个会话。

getCurrentSession():
当您调用 SessionFactory时。 getCurrentSession(),它将为您提供会话对象,该对象位于休眠上下文中,并在内部由休眠管理。它绑定到事务范围。当您调用SessionFactory.getCurrentSession()时,它将创建一个新的Session(如果不存在),否则使用当前休眠上下文中的同一会话。它会在事务结束时自动刷新并关闭会话,因此您无需进行外部操作。如果在单线程环境中使用休眠模式,则可以使用getCurrentSession(),因为与每次创建新会话相比,它的性能更快您需要在hibernate.cfg.xml中添加以下属性才能使用getCurrentSession方法。 线程

相关问题