java hibernate Aop_Spring4+Hibernate4 事务管理 配置 注解 AOP

在单独使用hibernate的时候

使用如下配置:

thread

根据文档,这个是hibernate3.1以后的一个新扩展,目的在于可以让我们在某一个上下文环境(比如说当前线程)中可以通过SessionFactory.getCurrentSession()得到同一个session会话.

该方式hibernate会自动关闭session,但是事务控制仍然需要手动开始和提交。

public Long createUser(UserVO user) {

Session session = sessionFactory.getCurrentSession();

Transaction tx = session.beginTransaction();

Long id = (Long) session.save(user);

tx.commit();

return id;

}

在Spring + Hibernate 整合时

我们希望通过 spring 使用声明式事务管理 或使用@Transactional注解进行事务管理。

如果 hibernate.current_session_context_class 属性配置为thread话,会抛一个异常: get is not valid without active transaction。这个错误一般情况是因为由getCurrentSession得到的session中没有获得的transaction,我们一般要手动的调用Transaction tx = session.beginTransaction(); 和 tx.commit() 来控制事务。但是问题是,我们在spring的配置文件中不是已经通过aop,指定了此处由spring来管理事务吗,怎么还要手动处理事务?

解决办法是将 thread 改为 org.springframework.orm.hibernate4.SpringSessionContext。

org.springframework.orm.hibernate4.SpringSessionContext

其实这就是默认值,把这段配置去掉,也是可以调用 sessionFactory.getCurrentSession(),以及使用 Spring 进行事务管理。

下面提我的配置和代码,经过测试ok。

pom.xml–项目jar包依赖

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

com.taj.test

hibernate-test

0.0.1-SNAPSHOT

org.hibernate

hibernate-core

4.3.11.Final

org.springframework

spring-context

4.2.4.RELEASE

org.springframework

spring-orm

4.2.4.RELEASE

org.aspectj

aspectjweaver

1.8.7

junit

junit

4.12

com.oracle

ojdbc14

10.2.0.4.0

46bc3231fa2b901c5429da3bc50368ed.png

applicationContext.xml

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"

xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-4.2.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-4.2.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-4.2.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">

class="org.springframework.jdbc.datasource.DriverManagerDataSource">

class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

classpath:com/taj/**/model

class="org.springframework.orm.hibernate4.HibernateTransactionManager">

hibernate.cfg.xml

/p>

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

true

org.hibernate.dialect.Oracle10gDialect

userDao

package com.taj.sshall.user.dao;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

import com.taj.sshall.user.model.UserVO;

@Component(value="userDao")

public class UserDaoSpringHibernateImpl extends UserDaoHibernateImpl {

@Autowired

@Override

public void setSessionFactory(SessionFactory sessionFactory){

super.setSessionFactory(sessionFactory);

}

/**

* sessionFactory.getCurrentSession()

* 1. Hibernate 自动管理,thread方式实现。session自动关闭,但是需要手动开启和关闭事务。

* thread

* 2. Spring 自动管理,通过AOP或注解@Transactional实现。session和事务都自动管理。

*

*/

@Override

//@Transactional

public Long createUser(UserVO user) {

Session session = sessionFactory.getCurrentSession();

//Transaction tx = session.beginTransaction();

Long id = (Long) session.save(user);

//tx.commit();

return id;

}

}

UserDaoHibernateImpl.Java

package com.taj.sshall.user.dao;

import java.util.List;

import org.hibernate.Criteria;

import org.hibernate.Query;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.criterion.Example;

import com.taj.sshall.common.page.PageVO;

import com.taj.sshall.user.model.UserVO;

public class UserDaoHibernateImpl implements IUserDao {

public SessionFactory sessionFactory;

public List findUserPage(UserVO user, PageVO page) {

//q_user_all

Session session = sessionFactory.openSession();

//Query query = session.getNamedQuery("q_user_all");

Criteria criteria = session.createCriteria(UserVO.class);

criteria.add(Example.create(user));

criteria.setFirstResult((page.getPage()-1) * page.getSize());

criteria.setMaxResults(page.getPage() * page.getSize());

@SuppressWarnings("unchecked")

List list = criteria.list();

return list;

}

public List findUsersByName(String userName) {

Session session = sessionFactory.openSession();

String hql = "from UserVO u where u.userName=?1";

Query query = session.createQuery(hql);

query.setString("1", userName);

@SuppressWarnings("unchecked")

List list = query.list();

return list;

}

public UserVO findUserById(Long userId) {

Session openSession = sessionFactory.openSession();

UserVO user = (UserVO)openSession.get(UserVO.class, userId);

openSession.close();

return user;

}

public Long createUser(UserVO user) {

Session openSession = sessionFactory.openSession();

Transaction tx = openSession.beginTransaction();

Long id = (Long) openSession.save(user);

tx.commit();

openSession.close();

return id;

}

public void updateUser(UserVO user) {

Session openSession = sessionFactory.openSession();

Transaction tx = openSession.beginTransaction();

openSession.update(user);

tx.commit();

openSession.close();

}

public void deleteUser(UserVO user) {

Session openSession = sessionFactory.openSession();

Transaction tx = openSession.beginTransaction();

openSession.delete(user);

tx.commit();

openSession.close();

}

public SessionFactory getSessionFactory() {

return sessionFactory;

}

public void setSessionFactory(SessionFactory sessionFactory) {

this.sessionFactory = sessionFactory;

}

}

userService

package com.taj.sshall.user.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

import com.taj.sshall.user.dao.IUserDao;

import com.taj.sshall.user.model.UserVO;

@Component("userService")

public class UserServiceSpringImpl implements IUserService {

@Autowired

private IUserDao userDao;

public Long createUser(UserVO user) {

Long createUser = userDao.createUser(user);

return createUser;

}

----------- 省略其他方法 -----------

}

SSHUtils.java

package com.taj.sshall.common;

import java.util.Arrays;

import java.util.Properties;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

import org.hibernate.cfg.Configuration;

import org.hibernate.service.ServiceRegistry;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SSHUtils {

private static ThreadLocal sessionFactoryLocal;

private static ThreadLocal applicationContextLocal;

public static SessionFactory getSessionFactory(){

if(sessionFactoryLocal == null){

Configuration cfg = new Configuration().configure();

Properties settings = cfg.getProperties();

ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()

.applySettings(settings).build();

SessionFactory sf = cfg.buildSessionFactory(serviceRegistry);

sessionFactoryLocal = new ThreadLocal();

sessionFactoryLocal.set(sf);

}

return sessionFactoryLocal.get();

}

public static ApplicationContext getAppContext(){

if(applicationContextLocal == null){

ApplicationContext context = newClassPathXmlApplicationContext("applicationContext.xml");

applicationContextLocal = new ThreadLocal();

applicationContextLocal.set(context);

}

return applicationContextLocal.get();

}

public static void main(String[] args) {

//测试sessionFactory

SessionFactory sessionFactory = getSessionFactory();

Session openSession = sessionFactory.openSession();

System.out.println(openSession);

openSession.close();

//测试appContext

ApplicationContext appContext = getAppContext();

String[] names = appContext.getBeanDefinitionNames();

System.out.println(Arrays.toString(names));

}

}

UserServiceSpringImplTest.java –(用Junit进行测试)

package com.taj.sshall.user.service;

import static org.junit.Assert.*;

import java.util.Date;

import org.junit.AfterClass;

import org.junit.BeforeClass;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import com.taj.sshall.common.SSHUtils;

import com.taj.sshall.user.model.UserVO;

public class UserServiceSpringImplTest {

private static IUserService userService;

@BeforeClass

public static void setUpBeforeClass() throws Exception {

ApplicationContext appContext = SSHUtils.getAppContext();

userService = (IUserService) appContext.getBean("userService");

}

@Test

public void testCreateUser() {

UserVO user = new UserVO();

user.setUserName("test_");

user.setPassword("1234567");

user.setAge(30);

user.setEmail("test_@126.com");

user.setCreateDate(new Date());

user.setLastUpdateDate(new Date());

Long id = userService.createUser(user);

assertTrue(id != null);

}

}

UserDaoHibernateImplTest.java –(用Junit进行测试)

package com.taj.sshall.user.dao;

import static org.junit.Assert.assertTrue;

import java.util.Arrays;

import java.util.Date;

import java.util.List;

import org.hibernate.Query;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

import com.taj.sshall.common.SSHUtils;

import com.taj.sshall.common.page.PageVO;

import com.taj.sshall.user.model.UserVO;

public class UserDaoHibernateImplTest {

public IUserDao userDao;

public SessionFactory sessionFactory;

@Before

public void before() throws Exception {

UserDaoHibernateImpl dao = new UserDaoHibernateImpl();

dao.setSessionFactory(SSHUtils.getSessionFactory());

this.userDao = dao;

this.sessionFactory = dao.getSessionFactory();

}

@Test

public void testFindUserPage() {

UserVO user = new UserVO();

user.setEmail("test@126.com");

PageVO page = new PageVO();

for (int i = 1; i <= 5; i++) {

page.setPage(i);

List lst = userDao.findUserPage(user, page);

System.out.println(Arrays.toString(lst.toArray()));

System.out.println("----------------------------------------------\n");

}

}

@Test

public void findUsersByName() {

List users = userDao.findUsersByName("test_0");

for (UserVO userVO : users) {

System.out.println("{" + userVO.getUserId() + ", "

+ userVO.getUserName() + ", " + userVO.getEmail() + "}");

}

}

@Test

public void testFindUserById() {

Long userId = 10000L;

UserVO user = userDao.findUserById(userId);

assertTrue("tajun77".equals(user.getUserName()));

assertTrue("123456".equals(user.getPassword()));

assertTrue("tajun77@126.com".equals(user.getEmail()));

assertTrue(27 == user.getAge());

}

@Test

public void testCreateUser() {

for (int i = 0; i < 25; i++) {

UserVO user = new UserVO();

user.setUserName("test_"+i);

user.setPassword("1234567");

user.setAge(30);

user.setEmail("test@126.com");

user.setCreateDate(new Date());

user.setLastUpdateDate(new Date());

Long id = userDao.createUser(user);

assertTrue(id != null);

}

}

@Test

public void testUpdateUser() {

UserVO user = userDao.findUserById(10001L);

int age = (user.getAge() + 7) % 30 + 20;

user.setAge(age);

userDao.updateUser(user);

UserVO user2 = userDao.findUserById(10001L);

assertTrue(user2.getAge() == age);

}

@Test

public void testDeleteUser() {

UserVO user = userDao.findUserById(10000L);

user.setUserName("testDelete");

Long id = userDao.createUser(user);

UserVO u_have = userDao.findUserById(id);

assertTrue(u_have != null);

UserVO udel = new UserVO();

udel.setUserId(id);

userDao.deleteUser(udel);// userName=test id=10003

UserVO u_no = userDao.findUserById(id);

assertTrue(u_no == null);

}

@After

public void after() throws Exception {

Session session = sessionFactory.openSession();

Transaction tx = session.beginTransaction();

Query query = session.createQuery("delete from UserVO u where u.userId > 10122");

query.executeUpdate();

tx.commit();

session.close();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值