hibernate中使用getCurrentSession()方法

从3.0.1版本开 始,Hibernate增加了SessionFactory.getCurrentSession()方法。
采用getCurrentSession()创建的session在commit或rollback时会自动关闭,如果commit()之后再关闭,就会报session已经关闭的错误;但是如果不commit()而执行关闭,虽然不会报什么错误,但是这时观察数据库添加数据是没有成功的,而openSession必须手动关闭。
在一个应用程序中,如果DAO 层使用Spring来控制session 的生命周期,则首选getCurrentSession()。

在 SessionFactory 启动的时候,Hibernate 会根据配置创建相应的 CurrentSessionContext,在 getCurrentSession()被调用的时候,实际被执行的方法是 CurrentSessionContext.currentSession()。在 currentSession() 执行时,如果当前Session 为空,currentSession 会调用 SessionFactory的openSession。

getCurrentSession配置:

如果使用的是本地事务(jdbc事务)

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

如果使用的是全局事务(jta事务)

<property name="hibernate.current_session_context_class">jta</property>

创建session的另一种方法:
Hibernate官方开发手册的示例中,提供了一个通过ThreadLocal维护Session的示例:这种方法可以使session提交后自动关闭

public class HibernateUtil {

private static SessionFactory sessionFactory;

static {

try {

// Create the SessionFactory

sessionFactory = new

Configuration().configure().buildSessionFactory();

} catch (HibernateException ex) {

throw new RuntimeException(

"Configuration problem: " + ex.getMessage(),

ex

);

}

}

public static final ThreadLocal session = new ThreadLocal();

public static Session currentSession() throws HibernateException

{

Session s = (Session) session.get();

// Open a new Session, if this Thread has none yet

if (s == null) {

s = sessionFactory.openSession();

session.set(s);

}

return s;

}

public static void closeSession() throws HibernateException {

Session s = (Session) session.get();

session.set(null);

if (s != null)

s.close();

}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hibernate是一个Java持久化框架,它提供了面向对象的方法来操作关系型数据库。下面是Hibernate使用步骤: 1. 添加Hibernate的依赖包到项目。 2. 配置Hibernate的配置文件hibernate.cfg.xml,配置数据库连接信息、实体类映射等。 3. 定义实体类,并在实体类使用Hibernate注解进行映射。 4. 编写DAO接口和实现类,使用Hibernate提供的API进行数据库操作。 5. 在需要使用Hibernate的地方,注入DAO接口并调用其方法。 下面是一个简单的示例代码: 1. 添加Hibernate依赖包,比如在Maven项目可以在pom.xml添加以下依赖: ```xml <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.4.27.Final</version> </dependency> ``` 2. 配置Hibernate的配置文件hibernate.cfg.xml,比如: ```xml <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydb</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123456</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <mapping class="com.example.User"/> </session-factory> </hibernate-configuration> ``` 3. 定义实体类User,并在实体类使用Hibernate注解进行映射,比如: ```java @Entity @Table(name="user") public class User { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id") private int id; @Column(name="name") private String name; @Column(name="age") private int age; // getter and setter methods } ``` 4. 编写DAO接口和实现类,使用Hibernate提供的API进行数据库操作,比如: ```java public interface UserDao { public void save(User user); public void update(User user); public void delete(int id); public User get(int id); public List<User> getAll(); } public class UserDaoImpl implements UserDao { private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } @Override public void save(User user) { Session session = sessionFactory.getCurrentSession(); session.save(user); } @Override public void update(User user) { Session session = sessionFactory.getCurrentSession(); session.update(user); } @Override public void delete(int id) { Session session = sessionFactory.getCurrentSession(); User user = (User) session.get(User.class, id); session.delete(user); } @Override public User get(int id) { Session session = sessionFactory.getCurrentSession(); User user = (User) session.get(User.class, id); return user; } @Override public List<User> getAll() { Session session = sessionFactory.getCurrentSession(); Query query = session.createQuery("from User"); List<User> list = query.list(); return list; } } ``` 5. 在需要使用Hibernate的地方,注入UserDao接口并调用其方法,比如: ```java public class UserServiceImpl implements UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public void save(User user) { userDao.save(user); } @Override public void update(User user) { userDao.update(user); } @Override public void delete(int id) { userDao.delete(id); } @Override public User get(int id) { return userDao.get(id); } @Override public List<User> getAll() { return userDao.getAll(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值