Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 弹簧靴;休眠,使用事务_Hibernate_Spring Boot_Transactional - Fatal编程技术网

Hibernate 弹簧靴;休眠,使用事务

Hibernate 弹簧靴;休眠,使用事务,hibernate,spring-boot,transactional,Hibernate,Spring Boot,Transactional,我正在尝试使用SpringBoot和hibernate。 当我使用存储库时,它工作得很好,但是我正在尝试使用Hibernate会话来创建一个DAO,而这个DAO不是事务的一部分 这是测试代码: Application.java @Configuration @ComponentScan @EnableAutoConfiguration @EnableTransactionManagement public class Application implements CommandLineRunne

我正在尝试使用SpringBoot和hibernate。 当我使用存储库时,它工作得很好,但是我正在尝试使用Hibernate会话来创建一个DAO,而这个DAO不是事务的一部分

这是测试代码:

Application.java

@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableTransactionManagement
public class Application implements CommandLineRunner {

    @Autowired
    private UserBusiness userBusiness;

    @Autowired
    @Bean(name="sessionFactory")
    public SessionFactory sessionFactory(HibernateEntityManagerFactory factory) {
        return factory.getSessionFactory();
    }       

    @Override
    public void run(String... arg0) throws Exception {
        try {
            userBusiness.createAdminUsers();
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println(userBusiness.listAll());
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args).close();
    }
}
UserBusinessImpl.java:

@Service
public class UserBusinessImpl implements UserBusiness {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private UserDao userDao;

    @Transactional(rollbackFor=Exception.class)
    public void createAdminUsers() throws Exception {
        userRepository.save(new User("User1", "u1", "123"));
        userRepository.save(new User("User2", "u2", "123"));
        userDao.test();
        throw new Exception("Rollback");
    }

    public List<User> listAll() {
        return userRepository.findAll();
    }
}
当我尝试getCurrentSession()时,它会抛出一个错误。 openSession()与我的事务分离,因此当业务抛出异常时,不会回滚Dao保存。其他两个镶块将回滚

在DAO中获取当前会话的正确方法是什么

更新: 如果我执行sessionFactory.openSession(),它不会给出任何异常,但它不是事务的一部分

如果我尝试使用sessionFactory.getCurrentSession(),这就是堆栈跟踪:

org.hibernate.HibernateException: No CurrentSessionContext configured!
2014-09-26 11:00:28.488 TRACE 20938 --- [           main] .s.t.s.TransactionSynchronizationManager : Bound value [org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$DefaultCrudMethodMetadata@ff80080] for key [public abstract java.util.List org.springframework.data.jpa.repository.JpaRepository.findAll()] to thread [main]
2014-09-26 11:00:28.488 DEBUG 20938 --- [           main] o.s.orm.jpa.JpaTransactionManager        : Creating new transaction with name [org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; ''
2014-09-26 11:00:28.489 DEBUG 20938 --- [           main] o.s.orm.jpa.JpaTransactionManager        : Opened new EntityManager [org.hibernate.jpa.internal.EntityManagerImpl@62e8dbb0] for JPA transaction
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1010)
    at org.sparta.hibernatetest.UserDao.teste(UserDao.java:35)
    at org.sparta.hibernatetest.business.UserBusinessImpl.createAdminUsers(UserBusinessImpl.java:44)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
    at com.sun.proxy.$Proxy48.createAdminUsers(Unknown Source)
    at org.sparta.hibernatetest.Application.run(Application.java:33)
    at org.springframework.boot.SpringApplication.runCommandLineRunners(SpringApplication.java:677)
    at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:695)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:321)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:952)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:941)
    at org.sparta.hibernatetest.Application.main(Application.java:42)
试试这个:

@Repository
public class UserDao {

   @PersistenceContext
   EntityManager entityManager;

   protected Session getCurrentSession()  {
      return entityManager.unwrap(Session.class);
   }

   public void test() {
      Session session = getCurrentSession();
      session().save(new User("testDao", "dao", "123"));
   }
}
你可以用

entityManager.persist(new User("testDao", "dao", "123"))

(和其他EntityManager方法)而不是直接使用Hibernate会话。

您遇到的异常,发布完整的stacktrace
getCurrentSession()
将只在事务的边界上工作,如果没有它,它将无法工作。因此,基本上让您的方法成为事务的一部分。但是我想知道为什么你已经有了一个可以保存的存储库,它使用JPA,那么为什么你甚至需要一个普通的
SessionFactory
。我不需要使用DAO来保存。作为一个例子,我把save放在DAO中。但我想要的是能够编写直接访问Hibernate的DAO,使我能够编写自己的标准,这由@Transactional管理
@Repository
public class UserDao {

   @PersistenceContext
   EntityManager entityManager;

   protected Session getCurrentSession()  {
      return entityManager.unwrap(Session.class);
   }

   public void test() {
      Session session = getCurrentSession();
      session().save(new User("testDao", "dao", "123"));
   }
}
entityManager.persist(new User("testDao", "dao", "123"))