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

不允许在共享的EntityManager上创建事务-使用Spring事务或EJB CMT

宰父飞白
2023-03-14
问题内容

这篇文章是JPA的延续。如何在持久化后从数据库获取值

当我执行以下命令时,我将遵循以下异常,该如何解决呢?

Not allowed to create transaction on shared EntityManager - use Spring 
transactions or EJB CMT

DAOImpl 代码

public void create(Project project) {
        entityManager.persist(project);
        entityManager.getTransaction().commit();
        project = entityManager.find(Project.class, project.getProjectId());
        entityManager.refresh(project);
        System.out.println("Id    -- " + project.getProjectId());
            System.out.println("no -- " + project.getProjectNo());
    }

applicationContext.xml

<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-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <bean id="DataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="username" value="scott" />
        <property name="password" value="tiger" />
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
        <property name="url" value="jdbc:oracle:thin:@myserver:1521:ORCL" />
    </bean>

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="DataSource" />
        <property name="packagesToScan" value="test.entity" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true" />
                <property name="generateDdl" value="false" />
                <property name="databasePlatform" value="org.hibernate.dialect.Oracle10gDialect" />
            </bean>
        </property>
    </bean>

    <context:component-scan base-package="test.net" />

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

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

     <context:annotation-config/>

</beans>

问题答案:

我猜这里的问题是,尽管您已经为事务管理器定义了bean,但是您没有注释@Transactional启用弹簧事务的create()方法。

还要删除该entityManager.getTransaction().commit();语句,因为现在所有事务管理都将在spring之前完成,如果您保留该语句不变,则将再次遇到相同的错误。



 类似资料:
  • 我已经安装了MongoDB v4。0获取Nodejs中it事务的最惊人功能,mongodb作为驱动程序。 当我尝试使用事务会话时,我遇到了以下错误: MongoError:事务号仅允许在副本集成员或mongos上使用。 那是什么,我怎么才能摆脱它? 欢迎提出任何建议。

  • 这意味着没有为内部 我找不出这里出了什么问题?非常感谢任何帮助。

  • 我正在使用Guice注入EntityManager。当我提交注入实体管理器的操作时,BD端没有发生任何事情:没有事务通过!!!你能帮我弄清楚发生了什么吗? 这是我的代码: 网状物xml Inject torListener类: 持久性模块类: GuiceModule类: RestModule类: 公共类RestModule扩展了JerseyServletModule{ 最后是网络服务(jeresy

  • 问题内容: 由于某些原因,我已经使用Spring PlatformTransactionManager手动执行了事务提交和回滚操作,我需要做的是设置一个钩子,以便在事务提交后执行后提交操作。 通过查看: 我没有看到我能确定交易是否成功,除了假设它没有假想。 而且我可以将AOP作为一种选择,但是以编程方式进行操作,也许使用回调方法呢? 问题答案: 你可以得到你想要什么以更简单的方式,和 使用,您可以

  • 我使用的是Spring-Kafka2.2.2.release(org.apache.kafka:kafka-clients:jar:2.0.1)和spring-boot(2.1.1)。我无法执行事务,因为我的侦听器无法获得分配的分区。我只为一个消费者创建了建议的配置。我正在尝试配置一个事务性侦听器容器,并且只处理一次 我使用事务管理器配置了生产者和使用者,生产者使用事务id,使用者使用isolat

  • 我试图用不同的事务管理器嵌套事务,其中如果嵌套的事务失败,外部主事务也需要回滚 我的spring配置文件有 但是,当失败时,中的事务不会回滚。如何使回滚工作?