Spring 4 + Hibernate 4 下 getCurrentSession()的使用情况

前言:1 getCurrentSession创建的session会和绑定到当前线程,而openSession不会。

    2 getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭

    这里getCurrentSession本地事务(本地事务:jdbc)时 要在配置文件里进行如下设置

      * 如果使用的是本地事务(jdbc事务)
    <property name="hibernate.current_session_context_class">thread</property>
  * 如果使用的是全局事务(jta事务)
    <property name="hibernate.current_session_context_class">jta</property> 

本人新手,在整合Spring 4.x  + Hibernate 4.x 时想用 getCurrentSession()来获取session,然后并不是 一句sessionFactory.getCurrentSession()就简单解决的。。。。。

  在其他配置都已完成的情况下加上 

                      spring管理事务

            获取session。。。。。执行save(e)方法。。。。

           Error  

  百度后发现,原因出现在 hibernate.current_session_context_class = thread 这句话上。当单独使用hibernate的时候,这句话就起作用了。在使用本地JDBC事务下,此时的创建的session就会被绑定到当前线程中。而我之前在配置的时候使用的是spring来管理事务,所以报错。

              : 

 

        Error  "No Session found for current thread"

           百度发现:SessionFactory的getCurrentSession并不能保证在没有当前Session的情况下会自动创建一个新的,这取决于 CurrentSessionContext的实现,SessionFactory将调用CurrentSessionContext的 currentSession()方法来获得Session。在Spring中,如果我们在没有配置TransactionManager并且没有事先调 用SessionFactory.openSession()的情况直接调用getCurrentSession(),那么程序将抛出“No Session found for current thread”异常

        之前我已经配置过TransactionManager了,怎么还会报错呢?   最后发现原来之前的配置  expression表达式写错了。。。细节决定成败!

 

转载于:https://www.cnblogs.com/nww57/p/5001159.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里提供一个简单的示例,涉及到基于 Spring、Struts2 和 Hibernate 的增删改查操作。 首先,我们需要创建一个实体类 User,并使用注解定义它的属性和表格映射: ``` @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private String name; private String email; private String password; // getters and setters } ``` 接下来,我们需要创建一个 DAO 接口和实现类,以便进行数据库操作。这里使用 Hibernate 的 API 来实现增删改查操作: ``` public interface UserDao { void save(User user); void delete(int id); User getById(int id); List<User> getAll(); } @Repository public class UserDaoImpl implements UserDao { @Autowired private SessionFactory sessionFactory; @Override public void save(User user) { Session session = sessionFactory.getCurrentSession(); session.save(user); } @Override public void delete(int id) { Session session = sessionFactory.getCurrentSession(); User user = session.byId(User.class).load(id); session.delete(user); } @Override public User getById(int id) { Session session = sessionFactory.getCurrentSession(); return session.get(User.class, id); } @Override public List<User> getAll() { Session session = sessionFactory.getCurrentSession(); CriteriaQuery<User> criteriaQuery = session.getCriteriaBuilder().createQuery(User.class); criteriaQuery.from(User.class); return session.createQuery(criteriaQuery).getResultList(); } } ``` 然后,我们需要创建一个 Service 层,以便在控制器使用它来进行数据库操作: ``` @Service @Transactional public class UserService { @Autowired private UserDao userDao; public void save(User user) { userDao.save(user); } public void delete(int id) { userDao.delete(id); } public User getById(int id) { return userDao.getById(id); } public List<User> getAll() { return userDao.getAll(); } } ``` 接下来,我们需要创建一个控制器类,以便处理用户请求,并调用 UserService 来进行数据库操作: ``` @Controller public class UserController { @Autowired private UserService userService; @RequestMapping("/") public String index(Model model) { List<User> users = userService.getAll(); model.addAttribute("users", users); return "index"; } @RequestMapping("/add") public String add(Model model) { model.addAttribute("user", new User()); return "add"; } @PostMapping("/save") public String save(@ModelAttribute("user") User user) { userService.save(user); return "redirect:/"; } @RequestMapping("/edit/{id}") public String edit(@PathVariable int id, Model model) { User user = userService.getById(id); model.addAttribute("user", user); return "edit"; } @PostMapping("/update") public String update(@ModelAttribute("user") User user) { userService.save(user); return "redirect:/"; } @RequestMapping("/delete/{id}") public String delete(@PathVariable int id) { userService.delete(id); return "redirect:/"; } } ``` 最后,我们需要创建视图文件(JSP 或 Thymeleaf)来渲染 HTML 页面,以便用户可以进行操作。 这就是一个基于 Spring、Struts2 和 Hibernate 的增删改查示例。当然,这只是一个简单的示例,实际应用可能需要更多的配置和代码来实现更复杂的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值