2015-06-04 2 views
0

Я застрял на транзакционной проблеме, используя Spring @Transactional с приложением JavaFX, все мои бобы и графические компоненты управляются весной.Spring JavaFX @Transactional entitymanager закрыт

Я инициализирую свое приложение @PostConstruct для своих контроллеров. В PostConstruct все мои daos работают отлично, но когда я вызываю службу для сохранения чего-либо, нажав кнопку JavaFX, я получил это исключение.

Caused by: org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.IllegalStateException: EntityManagerFactory is closed 
at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:431) 
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373) 
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:463) 
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:276) 
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
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.saveGame(Unknown Source) 
at dev.debizis.mtggui.desktop.controller.TemplateEditorController.handleSaveGameAction(TemplateEditorController.java:362) 
... 68 more 
    Caused by: java.lang.IllegalStateException: EntityManagerFactory is closed 
at org.hibernate.jpa.internal.EntityManagerFactoryImpl.validateNotClosed(EntityManagerFactoryImpl.java:388) 
at org.hibernate.jpa.internal.EntityManagerFactoryImpl.internalCreateEntityManager(EntityManagerFactoryImpl.java:342) 
at org.hibernate.jpa.internal.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:313) 
at org.springframework.orm.jpa.JpaTransactionManager.createEntityManagerForTransaction(JpaTransactionManager.java:449) 
at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:369) 
... 76 more 

Кто-нибудь знает, почему entityManager не открывается для транзакции с использованием @Transactonal по методу?

Моя Hibernate фасоль конфигурации:

http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd «>

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 

<!-- the property configurer for the datasource --> 
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>jdbc.properties</value> 
     </list> 
    </property> 
    <property name="ignoreUnresolvablePlaceholders" value="true" /> 
</bean> 

<!-- the DataSource (parameterized for configuration via a PropertyPlaceHolderConfigurer) --> 
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp2.BasicDataSource"> 
    <property name="driverClassName" value="${h2.jdbc.driverClassName}" /> 
    <property name="url" value="${h2.jdbc.url}" /> 
    <property name="username" value="${h2.jdbc.username}" /> 
    <property name="password" value="${h2.jdbc.password}" /> 
</bean> 

<!-- Hibernate SessionFactory Definition Debug --> 
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="packagesToScan" value="com.cardassiel.dao.entity" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
    </property> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.connection.autocommit">false</prop> 
      <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">validate</prop> 
      <prop key="hibernate.bytecode.use_reflection_optimizer">true</prop> 
      <prop key="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</prop> 
      <!-- <prop key="hibernate.enable_lazy_load_no_trans">true</prop> --> 
     </props> 
    </property> 
</bean> 

<!-- Hibernate Transaction Manager Definition --> 
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

Мое обслуживание s контекст

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd 
http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context.xsd"> 

<import resource="classpath*:dao-context.xml" /> 

<import resource="classpath*:common-context.xml" /> 

<context:component-scan base-package="com.cardassiel.core.service" /> 
<context:component-scan base-package="com.cardassiel.core.mapper" /> 

<!-- hibernate transaction by annotations --> 
<tx:annotation-driven transaction-manager="transactionManager" /> 

Мой метод сохранения:

/** {@inheritDoc} */ 
@Override 
@Transactional 
public final Long saveGame(final GameDTO game) { 
    LOGGER.debug("saveGame : name = {}", game.getName()); 
    return gameDao.saveOrUpdate(mapper.map(game, Game.class)); 
} 

Мой метод Dao:

/** {@inheritDoc}*/ 
@SuppressWarnings("unchecked") 
@Override 
public final P saveOrUpdate(final T o) { 
    if (entityManager.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier(o) == null) { 
     entityManager.persist(o); 
    } else { 
     entityManager.merge(o); 
    } 
    return (P) entityManager.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier(o); 
} 

Спасибо по заранее.

+0

Ничего не настроено для сканирования @Transactional. http://stackoverflow.com/questions/10019426/spring-transactional-not-working/10021874#10021874 <контекст: аннотация-конфиг /> <ТЙ: аннотация привода /> – MarkOfHall

+0

извините, я имею я забыл свой контекст службы с помощью , я отредактировал свой вопрос. – izakiel

+0

Итак, метод TemplateEditorController.handleSaveGameAction вызывает метод saveGame? Какой класс/пакет содержит saveGame? – MarkOfHall

ответ

2

Прочитав журналы, я понял, что произошло.

Нить закрывала приложениеКонтекст и неявно все синглетные бобы, включая сущностьManagerFactory!

СущностьManagerFactory может открываться только один раз за каждый жизненный цикл PersistenceUnit.

Когда транзакция попытается открыть entityManager с закрытой фабрикой, она выдает исключение.

Смежные вопросы