本文将为您提供关于无法为测试上下文的@Transactional测试检索PlatformTransactionManager的详细介绍,我们还将为您解释无法检测设置请稍后重试的相关知识,同时,我们还将
本文将为您提供关于无法为测试上下文的@Transactional测试检索PlatformTransactionManager的详细介绍,我们还将为您解释无法检测设置请稍后重试的相关知识,同时,我们还将为您提供关于DataSourceTransactionManager和 TransactionInterceptor、HibernateTransactionManager或JpaTransactionManager、ios – SKPaymentTransaction的originalTransaction.transactionReceipt为非易耗品还原、java – Hibernate:无法访问TransactionManager或UserTransaction来进行物理事务委托的实用信息。
本文目录一览:- 无法为测试上下文的@Transactional测试检索PlatformTransactionManager(无法检测设置请稍后重试)
- DataSourceTransactionManager和 TransactionInterceptor
- HibernateTransactionManager或JpaTransactionManager
- ios – SKPaymentTransaction的originalTransaction.transactionReceipt为非易耗品还原
- java – Hibernate:无法访问TransactionManager或UserTransaction来进行物理事务委托
无法为测试上下文的@Transactional测试检索PlatformTransactionManager(无法检测设置请稍后重试)
尝试在事务之间测试Hibernate(版本4)EHCache的缓存功能时,它失败:Failed to retrievePlatformTransactionManager for @Transactional test for test context
。
测试
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = { ApplicationConfig.class, CachingConfig.class }, loader = AnnotationConfigContextLoader.class)@PersistenceContext@Transactionalpublic class EHCacheTest extends AbstractTransactionalJUnit4SpringContextTests { @Autowired private SessionFactory sessionFactory;@Test public void testTransactionCaching(){ Session session = sessionFactory.getCurrentSession(); System.out.println(session.get(CustomerEntity.class, 1)); Query query = session.createQuery("from CustomerEntity where CustomerEntity.customerId<10").setCacheable(true).setCacheRegion("customer"); @SuppressWarnings("unchecked") List<CustomerEntity> customerEntities = query.list(); System.out.println(customerEntities); TestTransaction.flagForCommit(); TestTransaction.end(); TestTransaction.start(); Session sessionNew = sessionFactory.getCurrentSession(); System.out.println(sessionNew.get(CustomerEntity.class, 1)); Query anotherQuery = sessionNew.createQuery("from CustomerEntity where CustomerEntity.customerId<10"); anotherQuery.setCacheable(true).setCacheRegion("customer"); @SuppressWarnings("unchecked") List<CustomerEntity> customerListfromCache = anotherQuery.list(); System.out.println(customerListfromCache); TestTransaction.flagForCommit(); TestTransaction.end(); }}
手动编程事务处理是通过Spring 4.x在文档中建议的方式实现的。
应用程序配置
@Configuration@EnableTransactionManagement@EnableJpaRepositories (basePackages = { "com.hibernate.query.performance.persistence" }, transactionManagerRef = "jpaTransactionManager")@EnableJpaAuditing@PropertySource({ "classpath:persistence-postgresql.properties" })@ComponentScan({ "com.hibernate.query.performance.persistence" })public class ApplicationConfig { @Autowired private Environment env; public ApplicationConfig() { super(); } @Bean public LocalSessionFactoryBean sessionFactory() { final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); sessionFactory.setDataSource(applicationDataSource()); sessionFactory.setPackagesToScan(new String[] { "com.hibernate.query.performance.persistence.model" }); sessionFactory.setHibernateProperties(hibernateProperties()); return sessionFactory; } @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { final LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean(); emf.setDataSource(applicationDataSource()); emf.setPackagesToScan(new String[] { "com.hibernate.query.performance.persistence.model" }); final JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); emf.setJpaVendorAdapter(vendorAdapter); emf.setJpaProperties(hibernateProperties()); return emf; } @Bean public DataSource applicationDataSource() { final BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName"))); dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url"))); dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user"))); dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.pass"))); return dataSource; } @Bean public PlatformTransactionManager hibernateTransactionManager() { // TODO: Really need this? final HibernateTransactionManager transactionManager = new HibernateTransactionManager(); transactionManager.setSessionFactory(sessionFactory().getObject()); return transactionManager; } @Bean public PlatformTransactionManager jpaTransactionManager() { // TODO: Really need this? final JpaTransactionManager transactionManager = new JpaTransactionManager(); // http://stackoverflow.com/questions/26562787/hibernateexception-couldnt-obtain-transaction-synchronized-session-for-current transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); return transactionManager; } @Bean public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { return new PersistenceExceptionTranslationPostProcessor(); } private final Properties hibernateProperties() { final Properties hibernateProperties = new Properties(); hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect")); hibernateProperties.setProperty("hibernate.show_sql", "true"); hibernateProperties.setProperty("hibernate.format_sql", "true"); // hibernateProperties.setProperty("hibernate.globally_quoted_identifiers", "true"); hibernateProperties.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory"); // Envers properties hibernateProperties.setProperty("org.hibernate.envers.audit_table_suffix", env.getProperty("envers.audit_table_suffix")); // TODO: Really need this? return hibernateProperties; }}
缓存配置
@Configuration@EnableCachingpublic class CachingConfig implements CachingConfigurer { @Bean(destroyMethod="shutdown") public net.sf.ehcache.CacheManager ehCacheManager() { CacheConfiguration cacheConfiguration = new CacheConfiguration(); cacheConfiguration.setName("myCacheName"); cacheConfiguration.setMemoryStoreEvictionPolicy("LRU"); cacheConfiguration.setMaxElementsInMemory(1000); net.sf.ehcache.config.Configuration config = new net.sf.ehcache.config.Configuration(); config.addCache(cacheConfiguration); return net.sf.ehcache.CacheManager.create(config); } @Bean @Override public CacheManager cacheManager() { return new EhCacheCacheManager(ehCacheManager()); } @Override public CacheResolver cacheResolver() { return null; } @Bean @Override public KeyGenerator keyGenerator() { return new SimpleKeyGenerator(); } @Override public CacheErrorHandler errorHandler() { return null; }}
错误
java.lang.IllegalStateException: Failed to retrieve PlatformTransactionManager for @Transactional test for test context [DefaultTestContext@d8355a8 testClass = EHCacheTest, testInstance = com.hibernate.query.performance.EHCacheTest@3532ec19, testMethod = testTransactionCaching@EHCacheTest, testException = [null], mergedContextConfiguration = [MergedContextConfiguration@59fa1d9b testClass = EHCacheTest, locations = ''{}'', classes = ''{class com.hibernate.query.performance.config.ApplicationConfig, class com.hibernate.query.performance.config.CachingConfig}'', contextInitializerClasses = ''[]'', activeProfiles = ''{}'', propertySourceLocations = ''{}'', propertySourceProperties = ''{}'', contextLoader = ''org.springframework.test.context.support.AnnotationConfigContextLoader'', parent = [null]]].
如何使其运作?
更新:
通过添加(不确定是否@TestExecutionListeners
确实需要)来使其工作:
@Transactional(transactionManager = "hibernateTransactionManager")@TestExecutionListeners({})
答案1
小编典典如果未明确指定,则@Transactional需要在应用程序上下文中使用名称为transactionManager的bean。使用@Transaction批注值属性指定要与测试一起使用的事务管理器
例如,如果您想使用hibernateTransactionManager,请指定为
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = { ApplicationConfig.class, CachingConfig.class }, loader = AnnotationConfigContextLoader.class)@PersistenceContext@Transactional("hibernateTransactionManager")public class EHCacheTest extends AbstractTransactionalJUnit4SpringContextTests {}
否则,将您要使用的事务管理器重命名为默认名称transactionManager
@Bean public PlatformTransactionManager transactionManager() { // TODO: Really need this? final HibernateTransactionManager transactionManager = new HibernateTransactionManager(); transactionManager.setSessionFactory(sessionFactory().getObject()); return transactionManager; }
DataSourceTransactionManager和 TransactionInterceptor
DataSourceTransactionManager
TransactionInterceptor
HibernateTransactionManager或JpaTransactionManager
如何解决HibernateTransactionManager或JpaTransactionManager?
他希望您的代码依赖于JPA,而不是Hibernate。javax.persistence.EntityManager
是JPA(Java
EE)标准接口,同时org.hibernate.SessionFactory
是Hibernate专有接口。从SessionFactory移到EntityManager会使您的类不再依赖于Hibernate。如今,大多数人认为使用JPA-
way而不是Hibernate-way是最佳实践。
Please note that your system is still dependent upon Hibernate, as you need a JPA provider. But if you want to change to another JPA provider in the future it should be pretty straight forward. Another advantage for going for JPA is that the JPA-interfaces are more stable than the Hibernate ones.
解决方法
与朋友一起开发应用程序,但遇到一个问题…我有以下代码:
<bean id="sessionFactory">
<property name="dataSource" ref="dataSource" />
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${jdbc.dialect}</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop>
</props>
</property>
</bean>
<tx:annotation-driven />
<bean id="transactionManager">
<property name="dataSource" ref="dataSource" />
<property name="sessionFactory" ref="sessionFactory" />
</bean>
然后他删除了所有内容,将其更改为:
<bean id="transactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="entityManagerFactory">
<property name="persistenceUnitName" value="persistenceUnit"/>
<property name="dataSource" ref="dataSource"/>
</bean>
他说,这是更好的方法,但没有确切解释原因。 关于不直接使用hibernate方式的问题,这是否意味着我们不再使用hibernate方式了?这真的更好吗?
DAO更改如下:
我有:
@Autowired
private SessionFactory sessionFactory;
public void addUser(User user) {
sessionFactory.getCurrentSession().save(user);
}
现在是:
@PersistenceContext
private EntityManager entityManager;
public void addUser(User user) {
entityManager.persist(user);
}
ios – SKPaymentTransaction的originalTransaction.transactionReceipt为非易耗品还原
https://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/MakingaPurchase/MakingaPurchase.html#//apple_ref/doc/uid/TP40008267-CH3-SW2
有没有人真的得到这个不是零 – 如果是这样,怎么样?
在返回的SKPaymentTransactions中,看起来实际上正确的transactionReceipt在其transactionReceipt属性中(而不是它们的originalTransaction.transactionReceipt属性).
解决方法
这很奇怪,但即使Apple在其文档中声明在originalTransaction中找到了transactionReceipt,我在原始的SKPaymentTransaction类中找到了transactionReceipt.
所以,在选择要传递的事务之前,我已经设置了一点检查:
SKPaymentTransaction *passedTransaction = nil; if (transaction.transactionReceipt) { passedTransaction = transaction; } else if (transaction.originalTransaction.transactionReceipt) { passedTransaction = transaction.originalTransaction; }
java – Hibernate:无法访问TransactionManager或UserTransaction来进行物理事务委托
org.hibernate.resource.transaction.backend.jta.internal.JtaPlatformInaccessibleException: Unable to access TransactionManager or UserTransaction to make physical transaction delegate at org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl.makePhysicalTransactionDelegate(JtaTransactionCoordinatorImpl.java:229) at org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl.getTransactionDriverControl(JtaTransactionCoordinatorImpl.java:203) at org.hibernate.engine.transaction.internal.TransactionImpl.<init>(TransactionImpl.java:36) at org.hibernate.internal.AbstractSessionImpl.getTransaction(AbstractSessionImpl.java:309) at org.hibernate.internal.SessionImpl.<init>(SessionImpl.java:277) at org.hibernate.internal.SessionFactoryImpl$SessionBuilderImpl.openSession(SessionFactoryImpl.java:1322) at org.hibernate.jpa.internal.EntityManagerImpl.internalGetSession(EntityManagerImpl.java:133) at org.hibernate.jpa.spi.AbstractEntityManagerImpl.postinit(AbstractEntityManagerImpl.java:174) at org.hibernate.jpa.internal.EntityManagerImpl.<init>(EntityManagerImpl.java:83) at org.hibernate.jpa.internal.EntityManagerFactoryImpl.internalCreateEntityManager(EntityManagerFactoryImpl.java:311) at org.hibernate.jpa.internal.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:278) at cl.bicubic.App.getEntityManager(App.java:100) at cl.bicubic.dao.DAO.<init>(DAO.java:24) at cl.bicubic.dao.UserAtomicDAO.<init>(UserAtomicDAO.java:15) at cl.bicubic.Application.init(Application.java:70) at javax.servlet.GenericServlet.init(GenericServlet.java:158) at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1241) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1154) at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:827) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:655) at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745)
以下是持久性单元中Hibernate的配置:
<properties> <property name="hibernate.connection.url" value="jdbc:postgresql://localhost/mydb?charSet=UTF-8"/> <property name="hibernate.connection.user" value="dbuser"/> <property name="hibernate.connection.password" value="dbpass"/> <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/> <property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider"/> <property name="hibernate.dialect" value="org.hibernate.dialect.Postgresql9Dialect"/> <property name="hibernate.c3p0.min_size" value="5"/> <property name="hibernate.c3p0.max_size" value="20"/> <property name="hibernate.c3p0.timeout" value="1800"/> <property name="hibernate.c3p0.max_statements" value="50"/> <property name="hibernate.connection.charSet" value="UTF-8"/> <property name="hibernate.hbm2ddl.auto" value="update"/> <property name="hibernate.id.new_generator_mappings" value="true"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> </properties>
这就是我创建EntityManagerFactory的方法:
public class App { ... private static EntityManagerFactory entityManagerFactory; ... public static void setServletContext(ServletContext context) throws IOException { ... entityManagerFactory = Persistence.createEntityManagerFactory("persistence-unit-name"); ... } ... public static EntityManager getEntityManager() { return entityManagerFactory.createEntityManager(); //Here Throws the Exception } ... }
我使用servletcontextlistener调用此方法
@WebListener public class Applicationservletcontextlistener implements servletcontextlistener { @Override public void contextinitialized(ServletContextEvent sce) { try { App.setServletContext(sce.getServletContext()); } catch (Exception ex) { Logger.getLogger(Applicationservletcontextlistener.class.getName()).log(Level.SEVERE,null,ex); } } ... }
这就是我尝试创建EntityManager的方法
public class DAO { ... protected EntityManager entityManager; ... public DAO() { entityManager = App.getEntityManager(); ... } ... }
我试图寻找有关这个JtaPlatformInaccessibleException的起源的更多信息,但我什么都没发现.我不确定缺少什么.
解决方法
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform"/>
关于无法为测试上下文的@Transactional测试检索PlatformTransactionManager和无法检测设置请稍后重试的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于DataSourceTransactionManager和 TransactionInterceptor、HibernateTransactionManager或JpaTransactionManager、ios – SKPaymentTransaction的originalTransaction.transactionReceipt为非易耗品还原、java – Hibernate:无法访问TransactionManager或UserTransaction来进行物理事务委托的相关信息,请在本站寻找。
本文标签: