gpt4 book ai didi

java - getCurrentSession 在没有 openSession 的情况下如何工作?

转载 作者:行者123 更新时间:2023-11-29 05:01:51 28 4
gpt4 key购买 nike

这是我的代码:

hibernate .cfg.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/sakila</property>
<property name="connection.username">root</property>
<property name="connection.password"/>

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

<property name="current_session_context_class">thread</property>
<property name="hibernate.show_sql">false</property>

<mapping class="biz.tugay.saqila.model.Actor" />
</session-factory>
</hibernate-configuration>

HibernateUtil.java

package biz.tugay.saqila.dao;
/* User: koray@tugay.biz Date: 06/08/15 Time: 18:29 */

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

public class HibernateUtil {

private static SessionFactory SESSION_FACTORY;

public static void buildSessionFactory() {
if (SESSION_FACTORY != null) {
return;
}

Configuration configuration = new Configuration();
configuration.configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties()).build();
SESSION_FACTORY = configuration.buildSessionFactory(serviceRegistry);

}

public static Session getCurrentSession() {
return SESSION_FACTORY.getCurrentSession();
}

public static void killSessionFactory() {
if (SESSION_FACTORY != null) {
SESSION_FACTORY.close();
}
}

}

和一个示例 DAO 类:

package biz.tugay.saqila.dao;
/* User: koray@tugay.biz Date: 06/08/15 Time: 18:37 */

import biz.tugay.saqila.model.Actor;
import org.hibernate.Session;

import java.util.List;

@SuppressWarnings("unchecked")
public class ActorDao {

public List<Actor> getAllActors() {
Session session = HibernateUtil.getCurrentSession();
session.beginTransaction();
List<Actor> actors = session.createQuery("FROM Actor").list();
session.close();
return actors;
}

public Actor getWithId(int id) {
Session session = HibernateUtil.getCurrentSession();
session.beginTransaction();
Actor actor = (Actor) session.get(Actor.class, id);
session.close();
return actor;
}

}

如您所见,我没有在任何地方调用 openSession,只是 getCurrentSession。但这是如何工作的呢?

此外,这是做事的正确方法还是我只是幸运这行得通?

顺便说一句,我也有这个听众:

package biz.tugay.saqila.servlet;
/* User: koray@tugay.biz Date: 06/08/15 Time: 19:00 */


import biz.tugay.saqila.dao.HibernateUtil;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class HibernateConfigurator implements ServletContextListener {

@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
HibernateUtil.buildSessionFactory();
}

@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("Killing Session Factory.");
HibernateUtil.killSessionFactory();
}

}

最佳答案

如果将 hibernate.current_session_context_class 设置为线程,则可以使用 SessionFactory.getCurrentSession() 在应用程序的任何位置访问该 session 。

如果您不希望 session 绑定(bind)到上下文,请使用 OpenSession 。在某些情况下,您可能需要不同的 session - 而不是绑定(bind)到上下文的 session ,在这种情况下,您可以使用 OpenSession 而不是 currentSession。

SessionFactory.openSession() 总是会打开一个新 session ,您必须在完成数据库操作后关闭该 session 。 SessionFactory.getCurrentSession() 返回绑定(bind)到上下文的 session ,您无需关闭它。

您永远不应该为每个应用程序使用一个 session - session 不是线程安全的对象,它不能被多个线程共享。总是每个应用程序使用一个 session 交易

关于java - getCurrentSession 在没有 openSession 的情况下如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31871219/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com