当前位置: 首页 > 面试题库 >

声明式事务(@Transactional)在Spring中不适用于@Repository

危阳
2023-03-14
问题内容

我正在尝试使用Spring,JPA和嵌入式H2数据库制作简单的应用程序。最近,我在声明式事务中遇到了这个奇怪的问题。如果我使用@Repository批注自动装配DAO,则它们不会提交。更具体地说,我在冲洗时出现异常:

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;
    }
}

@Repository
public class JpaDao {

    @PersistenceContext
    private EntityManager em;

    @Transactional
    public void addProfessor(Professor professor) {
        em.persist(professor);
        em.flush();
    }
}

database.xml(包含在root spring上下文中)

<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-scanspring- 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