如果我使用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
(?, ?)
答案 0 :(得分:1)
openSession():
调用 SessionFactory.openSession()时,它将始终创建新的Session对象并将其提供给您。您需要显式刷新并关闭这些会话对象。由于会话对象不是线程安全的,因此在多线程环境中,每个请求需要创建一个会话对象,而在Web应用程序中,每个请求也需要创建一个会话。
getCurrentSession():
当您调用 SessionFactory时。 getCurrentSession(),它将为您提供会话对象,该对象位于休眠上下文中,并在内部由休眠管理。它绑定到事务范围。当您调用SessionFactory.getCurrentSession()时,它将创建一个新的Session(如果不存在),否则使用当前休眠上下文中的同一会话。它会在事务结束时自动刷新并关闭会话,因此您无需进行外部操作。如果在单线程环境中使用休眠模式,则可以使用getCurrentSession(),因为与每次创建新会话相比,它的性能更快您需要在hibernate.cfg.xml中添加以下属性才能使用getCurrentSession方法。
线程