我正在尝试学习Spring框架,并且已经完成了复数视觉教程。
我目前遇到问题而不确定如何解决。 Hibernate和JPA已添加到项目中,它们创建表很好。本教程的下一部分将介绍如何使用实体管理器以及如何将对象保存到数据库。
我的代码模仿了他,除了我已经更新到更新版本的Spring并添加了大量的评论。
我收到的错误是:HTTP Status 500 - Request processing failed; nested exception is javax.persistence.TransactionRequiredException: No transactional EntityManager available
在这些代码段中调用,声明和定义了实体管理器。
控制器:
@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;
}
}
我已经回过头看了视频而无法看到它可能出错的地方,我已经在调试中逐步完成但是看不到任何明显的东西,即使它可能我也不会看到它
有人可以放任何光吗?
非常感谢。
编辑:如果我注释掉实体管理,它运行正常,显然没有得到保存,但它没有通过例外。
@Override
public Goal save(Goal goal) {
//entityManager.persist(goal);
return null;
}
编辑 - 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)
这可能是侥幸,我不确定......
我感动了
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>`
从jpaContext.xml进入servlet-config.xml。我发现很少有类似的帖子暗示这些应该与组件扫描发生在同一个类中。
我不认为这是整个解决方案,因为我仍然遇到问题。
然后我发现了一个引用了@Transactional注释的随机帖子。我添加了这个@Override
@Transactional
public Goal save(Goal goal) {
return goalRepository.save(goal);
}
并且瞧..它有效。它是否应该完全是另一回事,希望如果他们也在做教程,这可能会帮助那些偶然发现它的人。