我正在尝试使用Spring,JPA和嵌入式H2数据库制作简单的应用程序。最近,我在声明式事务中遇到了这个奇怪的问题。如果我使用@Repository批注自动装配DAO,则它们不会提交。更具体地说,我在冲洗时出现异常:
javax.persistence.TransactionRequiredException:
Exception Description: No transaction is currently active
这是我的设置:
<persistence-unit name="schedulePU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:h2:~/scheduleDB" />
<property name="javax.persistence.jdbc.user" value="sa" />
<property name="javax.persistence.jdbc.password" value="" />
<property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.H2Platform" />
<property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
<property name="eclipselink.logging.level" value="FINE"/>
</properties>
</persistence-unit>
@Entity
@Table(name = "Professors")
public class Professor {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
public Professor() { }
public Professor(String name) {
this.name = name;
}
}
@Repository
public class JpaDao {
@PersistenceContext
private EntityManager em;
@Transactional
public void addProfessor(Professor professor) {
em.persist(professor);
em.flush();
}
}
<beans>
<context:component-scan base-package="com.spybot.schedule.dao" />
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="schedulePU" />
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>
@Controller
public class HomeController {
@Inject
JpaDao dao;
@RequestMapping("/add")
public @ResponseBody String add(String name) {
Professor p = new Professor(name);
dao.addProfessor(p);
return ":)";
}
}
现在是有趣的部分。如果我从DAO中删除@Repository批注,并在database.xml中显式指定它,则一切正常。
将另一个<tx:annotation-driven />
放入 spring servlet config可以解决此问题,但是为什么呢?
可能是因为component-scan
您spring- servlet.xml
的扫描中还包含您的DAO类,因此在其应用程序上下文中为它们创建了实例(而不是“数据库”)……因此,当您的Web从Web控制器访问这些DAO时,它就在访问的非交易版本(除非您添加该tx:annotation- driven
标签)。
因此,添加该标签实际上是一个不好的解决方案,因为它仍会在错误的应用程序上下文中创建您的DAO实例:更好地base- package
为您的Web层组件创建创建更具体的配置。
因为我以为我有这个同样的问题<context:include-filter>
,我spring- servlet.xml
是只取扫描的保健@Controller
类......但没有:-(
声明式事务, 可以脱离Trans类实现单个方法或多个的事务模板. 例如设置Service类所有insert开头的方法,均应用READ_COMMITTED事务 声明式事务,是通过aop拦截器做的, 而aop依赖ioc, 在@IocBy注解中启用即可. @IocBy(type=ComboIocProvider.class, args={"*json","org/nutz/mvc/testap
请说出这段代码有什么问题。
本文向大家介绍spring声明式事务管理解析,包括了spring声明式事务管理解析的使用技巧和注意事项,需要的朋友参考一下 前沿:通过对spring事务管理有了比较深入学习,本文将不做实例,而是指定具体的类和配置文件进行讲解。 本文内容: 1、了解什么是声明式事务? 2、声明式事务管理分别有哪几种? 3、这几种事务管理之间的区别是什么? 一、什么是声明式事务? 声明式事务(decl
9.4 声明式事务 9.4.1 声明式事务概述 从上节编程式实现事务管理可以深刻体会到编程式事务的痛苦,即使通过代理配置方式也是不小的工作量。 本节将介绍声明式事务支持,使用该方式后最大的获益是简单,事务管理不再是令人痛苦的,而且此方式属于无侵入式,对业务逻辑实现无影响。 接下来先来看看声明式事务如何实现吧。 9.4.2 声明式实现事务管理 1、定义业务逻辑实现,此处使用ConfigUserSer
问题内容: Pycharm 2016.2.3,Mac OS X 10.11.1,Python 3.5(Homebrew); 我有这个文件夹结构 所以我的预期输出是 从PyCharm运行时,此方法工作正常。但是,当我从终端运行它时,我收到一个ImportError: 我已经找到了这个问题,这是关于相同的问题。但是,没有建议的解决方案对我有用,因为我确实使用的是与PyCharm相同的Python解释器
本文向大家介绍SpringBoot 注解事务声明式事务的方式,包括了SpringBoot 注解事务声明式事务的方式的使用技巧和注意事项,需要的朋友参考一下 springboot 对新人来说可能上手比springmvc要快,但是对于各位从springmvc转战到springboot的话,有些地方还需要适应下,尤其是xml配置。我个人是比较喜欢注解➕xml是因为看着方便,查找方便,清晰明了。但是xm