GVKun编程网logo

无法为测试上下文的@Transactional测试检索PlatformTransactionManager(无法检测设置请稍后重试)

11

本文将为您提供关于无法为测试上下文的@Transactional测试检索PlatformTransactionManager的详细介绍,我们还将为您解释无法检测设置请稍后重试的相关知识,同时,我们还将

本文将为您提供关于无法为测试上下文的@Transactional测试检索PlatformTransactionManager的详细介绍,我们还将为您解释无法检测设置请稍后重试的相关知识,同时,我们还将为您提供关于DataSourceTransactionManager和 TransactionInterceptor、HibernateTransactionManager或JpaTransactionManager、ios – SKPaymentTransaction的originalTransaction.transactionReceipt为非易耗品还原、java – Hibernate:无法访问TransactionManager或UserTransaction来进行物理事务委托的实用信息。

本文目录一览:

无法为测试上下文的@Transactional测试检索PlatformTransactionManager(无法检测设置请稍后重试)

无法为测试上下文的@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

DataSourceTransactionManager

TransactionInterceptor

HibernateTransactionManager或JpaTransactionManager

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为非易耗品还原

ios – SKPaymentTransaction的originalTransaction.transactionReceipt为非易耗品还原

在调用restoreCompletedTransactions之后,对于非消耗品,正在返回的SKPaymentTransactions在其originalTransaction.transactionReceipt属性中似乎为nil.这是文档说我们应该找到原始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来进行物理事务委托

java – Hibernate:无法访问TransactionManager或UserTransaction来进行物理事务委托

我正在使用Servlets,Postgresql和Hibernate与EntityManager构建一个Web应用程序,一切正常,直到我将项目移动到基于Maven的项目.现在,每次尝试从EntityManagerFactory创建EntityManager时,我都会收到这个奇怪的异常:
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的起源的更多信息,但我什么都没发现.我不确定缺少什么.

解决方法

只需将属性添加到persistence.xml即可
<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来进行物理事务委托的相关信息,请在本站寻找。

本文标签: