java – 声明式事务(@Transactional)在Spring中不能与@Repository一起使用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 声明式事务(@Transactional)在Spring中不能与@Repository一起使用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2931字,纯文字阅读大概需要5分钟。
内容图文
我正在尝试使用Spring,JPA和嵌入式H2数据库进行简单的应用程序.最近我遇到了声明性交易这个奇怪的问题.如果我使用@Repository注释自动装配我的DAO,它们就不会提交.更具体地说,我在flush上获得异常:
javax.persistence.TransactionRequiredException:
Exception Description: No transaction is currently active
这是我的设置:
persistence.xml中
<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;
}
}
DAO
@Repository
public class JpaDao {
@PersistenceContext
private EntityManager em;
@Transactional
public void addProfessor(Professor professor) {
em.persist(professor);
em.flush();
}
}
database.xml(从root spring context包含)
<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配置修复问题,但为什么呢?
解决方法:
可能是因为spring-servlet.xml中的组件扫描在扫描中也包含DAO类,因此在其应用程序上下文(而不是“数据库”)中为它们创建实例…这样当您的Web访问这些时来自Web控制器的DAO,它正在访问它们的非事务版本(除非您添加了tx:annotation-driven标记).
因此,添加该标记实际上是一个糟糕的解决方案,因为它仍然在错误的应用程序上下文中创建DAO实例:更好地为您的Web层组件创建创建更具体的基础包配置.
我有同样的问题,因为我认为< context:include-filter>在我的spring-servlet.xml中只负责扫描@Controller类…但没有:-(
内容总结
以上是互联网集市为您收集整理的java – 声明式事务(@Transactional)在Spring中不能与@Repository一起使用全部内容,希望文章能够帮你解决java – 声明式事务(@Transactional)在Spring中不能与@Repository一起使用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。