2015-07-30 2 views
1

Я пытаюсь осуществлять транзакционное взаимодействие с моей базой данных MySQL через данные JPA и Spring.Отсутствует транзакционный EntityManager, хотя он настроен

конфигурации

@Configuration 
@EnableJpaRepositories("com.some.models.repositories") 
@EnableTransactionManagement 
public class MegabotsConfiguration { 

    @Bean 
    public EntityManagerFactory entityManagerFactory() { 

     HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
     vendorAdapter.setGenerateDdl(true); 

     LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
     factory.setJpaVendorAdapter(vendorAdapter); 
     factory.setJpaProperties(additionalProperties()); 
     factory.setPackagesToScan(new String[] { "com.datarank.megabots.models.entities", "com.datarank.megabots.models.repositories" }); 
     factory.setDataSource(dataSource()); 
     factory.afterPropertiesSet(); 

     return factory.getObject(); 
    } 

    @Bean 
    public DataSource dataSource(){ 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
     dataSource.setUrl("jdbc:mysql://localhost:3306/local_ttaggdb"); 
     dataSource.setUsername("root"); 
     dataSource.setPassword(""); 
     return dataSource; 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager() { 

     JpaTransactionManager txManager = new JpaTransactionManager(); 
     txManager.setEntityManagerFactory(entityManagerFactory()); 
     return txManager; 
    } 

    @Bean 
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){ 
     return new PersistenceExceptionTranslationPostProcessor(); 
    } 

    Properties additionalProperties() { 
     Properties properties = new Properties(); 
     properties.setProperty("hibernate.hbm2ddl.auto", "create-drop"); 
     properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect"); 
     return properties; 
    } 
//... 
} 

А вот где я пытаюсь использовать транзакцию:

@Repository 
@Scope("prototype") 
@Transactional 
public class BotWorkQueueRepository { 

    @Autowired 
    private BotWorkQueueJPARepository botWorkQueueJPARepository; //this is the jparepository referenced in the @EnableJpaRepositories in config 

    @PersistenceContext 
    private EntityManager entityManager; 

    @Transactional 
    public synchronized void flagInFlight(final List<BotWorkQueueEntity> botWorkQueueEntities) { 
     try { 
      //...set a few properties on entities, then 
      entityManager.flush(); //Exception thrown here 
      entityManager.clear(); 
     } catch (Exception e) { 
      LOGGER.warn("Error making in flight: " + e); 
     } 
    }  
} 

Ошибка я получаю:

javax.persistence.TransactionRequiredException: No transactional EntityManager available 

Я попробовал большинство решений для этой ошибки, опубликованной в SO, без успеха.

ответ

0

Одна вещь для стартера, В maven, если вы используете appassembler-maven-plugin, добавьте следующую строку в свой тег plugin.configuration в файле POM.

<extraJvmArguments>-javaagent:"$REPO"/org/aspectj/aspectjweaver/1.8.5/aspectjweaver-1.8.5.jar</extraJvmArguments>

Если вы работаете в среде IDE добавьте следующую строку в ваших аргументов VM.

-javaagent:<PATH TO MAVEN REPO>/org/aspectj/aspectjweaver/1.8.5/aspectjweaver-1.8.5.jar

Где путь к Maven репо может выглядеть как /User/kenny/.m2/repository/.

$REPO будет автоматически разрешен в файле POM.

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