2015-05-14 2 views
0

Я пытаюсь изучить структуру Spring и работаю над учебниками множественного обзора.Оператор транзакции не доступен Spring/JPA/Hibernate - Pluralsight

У меня возникли проблемы и не знаю, как их решить. Hibernate и JPA были добавлены в проект, они созданы отлично. В следующей части учебника показано, как вы будете использовать диспетчер Entity Manager и как вы собираетесь сохранять объект в базе данных.

Мой код имитирует его, за исключением того, что я обновился до новой версии Spring и добавил массу комментариев.

Ошибка я получаю это: HTTP Status 500 - Request processing failed; nested exception is javax.persistence.TransactionRequiredException: No transactional EntityManager available

Менеджер Entity называется, декларируются и определяются в этих сниппета.

Контроллер:

@Controller 
@SessionAttributes("goal") 
public class GoalController { 

@Autowired 
private GoalService goalService; 

@RequestMapping(value = "addGoal", method = RequestMethod.POST) 
public String updateGoal(@Valid @ModelAttribute("goal") Goal goal,  BindingResult result) { 
... 
     goalService.save(goal); 


    return "redirect:index.jsp"; 
} 

}

GoalService представляет собой интерфейс, который имеет в нем простую Goal save(Goal goal);, который затем реализуется с помощью GoalServiceImpl.

GoalServiceImpl:

@Service("goalService") 
public class GoalServiceImpl implements GoalService { 

@Autowired 
private GoalRepository goalRepository; 

@Override 
public Goal save(Goal goal) { 
    return goalRepository.save(goal); 
} 

GoalRepository имеет ту же картину.

GoalrespositoryImpl:

@Repository("goalRepository") 

общественного класса GoalRepositoryImpl реализует GoalRepository {

@PersistenceContext 
private EntityManager entityManager; 

@Override 
public Goal save(Goal goal) { 
    entityManager.persist(goal); 
    return goal; 
} 

}

Я вернулся на видео и не может видеть, где он мог бы идти неправильно , Я прошел через него в отладке, но не вижу ничего очевидного и, даже если бы это было, я, вероятно, не видел бы его.

Может ли кто-нибудь пролить свет, пожалуйста?

Большое спасибо.

EDIT: Если я прокомментирую сущность, она работает нормально, очевидно, что она не сохраняется, но не исключается.

@Override 
public Goal save(Goal goal) { 
    //entityManager.persist(goal); 
    return null; 
} 

EDIT - DataSource:

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:context="http://www.springframework.org/schema/context" 
    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-3.2.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-4.1.xsd"> 

<context:annotation-config/> 

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

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="punit"/> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="showSql" value="true"/> 
     </bean> 
    </property> 
    <property name="jpaPropertyMap"> 
     <map> 
      <entry key="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/> 
      <entry key="hibernate.hbm2ddl.auto" value="create"/> 
      <entry key="hibernate.format_sql" value="true"/> 
     </map> 
    </property> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</bean> 

<tx:annotation-driven transaction-manager="transactionManager"/> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
    <property name="url" value="jdbc:mysql://localhost:3306/fitnessTracker?autoReconnect=true"/> 
    <property name="username" value="root"/> 
    <property name="password" value="password"/> 
</bean> 

+0

Где вы определили источник данных? –

+0

@prashantthakre - я отредактировал вопрос с деталями, так как есть большой объем кода, спасибо за то, что посмотрели. – null

+0

Похоже, вы возили свой 'dispatcher-config.xml', можете ли вы проверить, что у вас есть правильный код, например' и ' –

ответ

0

Это может быть чистой случайностью, я не уверен ...

Я переехал `

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</bean>` 

o ut jpaContext.xml и в servlet-config.xml. Я нашел несколько похожих сообщений, которые намекают, что они должны быть в том же классе, что и в случае сканирования компонентов.

Я не думаю, что это все решение, хотя у меня все еще были проблемы.

Затем я нашел случайное сообщение, в котором упоминается аннотация @Transactional. Я добавил @Override @Transactional public Goal save(Goal goal) { return goalRepository.save(goal); }

и voila..it работает. Должно ли это быть или нет, это совсем другое дело, надеюсь, это может помочь кому-то, кто наткнулся на него, если они также делают учебник.

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