gpt4 book ai didi

hibernate - Spring-boot & hibernate,使用事务

转载 作者:行者123 更新时间:2023-12-04 23:49:35 24 4
gpt4 key购买 nike

我正在尝试使用 spring-boot 和 hibernate。
当我使用存储库时,它运行良好,但我试图获得一个 Hibernate session 来创建一个 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> {
}

用户道:
@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 中获取 currentSession 的正确方法是什么?

更新:
如果我执行 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"));
}
}

关于hibernate - Spring-boot & hibernate,使用事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26049294/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com