当前位置: 首页 > 知识库问答 >
问题:

Spring防尘套

宇文飞翮
2023-03-14

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

这是测试代码:

应用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();
    }
}

用户存储库。Java语言

public interface UserRepository extends JpaRepository<User, Long> {
}

用户DAO:

@Repository
public class UserDao {

    @Autowired
    private SessionFactory sessionFactory;

    public void teste() {
        //current session does not exists and throws org.hibernate.HibernateException: No CurrentSessionContext configured!
//        sessionFactory.getCurrentSession().save(new User("testDao", "dao", "123"));
        sessionFactory.openSession().save(new User("testDao", "dao", "123"));
    }
}

当我尝试getCurrentSession()时,它抛出了一个错误。openSession()与我的事务分离,因此当业务抛出异常时,Dao保存不会回滚。其他两个插入件被回滚。

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

更新:如果我actory.open会话(),它不会给出任何异常,但它不是事务的一部分。

如果我尝试使用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)

共有2个答案

韶宏邈
2023-03-14

你可以用

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

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

孔和风
2023-03-14

试试这个:

@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"));
   }
}
 类似资料:
  • 我试图通过遵循这里的教程,使用Spring boot在Java中创建一个RESTful应用程序。我想修改它,以便可以从URL中提取标识符,并使用它来服务请求。 所以

  • 我在本地系统上创建了一个带有Rest控制器和Oracle的spring boot应用程序,通过IDE它运行良好,mvn build was fine包也很好,但如果我将其作为可执行jar运行,我会得到以下错误。我有申请表。我提供的所有spring的属性。数据源,但这里我得到了错误。请告知。 这是我的pom.xml: 我正在尝试Spring Boot并尝试将其作为可执行的jar运行。

  • 我目前正在尝试编写一个Spring Boot启动器,它将使用API网关自动验证我们的微服务,并在所有传出请求(针对网关)的标头中包含访问令牌。 我正在创建一个RestTemboard bean并为其提供我们的自定义拦截器,但我的问题是,通过这样做,我阻止其他团队(将使用此启动器)使用他们自己的RestTemboard配置,因为他们必须定义导致多个bean存在的相同bean。 是否有其他方法可以拦截

  • 我目前正在开发一个以Spring Boot为后端的Angular 4应用程序。我使用Maven来构建如中所述配置的项目https://blog.jdriven.com/2016/12/angular2-spring-boot-getting-started/ 我现在想用其他语言翻译这个应用程序。我看着http://www.baeldung.com/spring-boot-international

  • 我想将Spring启动执行器添加到我的应用程序,但当我添加此依赖项时 我得到以下错误 java.lang.reflect.InvocationTargetException at_NativeMethodAccessorImpl.invoke0(Native Method)at(...)由以下原因引起:org.springframework.beans.factory.不满意DependencyE

  • 我正在尝试使用现有的Gradle Spring MVC项目设置Spring执行器。我无法使用@EnableAutoConfiguration。不幸的是,我无法到达执行器endpoint,我想我遗漏了一些东西。 项目中的Spring依赖项包括: 我正在尝试使用以下内容配置project: 在属性文件中,我添加了: 没有启用执行器endpoint,当尝试访问它们时,我得到404。我经历了许多相关问题,