首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不允许在共享EntityManager上创建事务--使用Spring或EJB

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

Stack Overflow用户
提问于 2013-07-25 14:21:13
回答 3查看 96K关注 0票数 53

这个职位是JPA How to get the value from database after persist的延续。

当我执行下面的异常时,如何解决这个问题?

代码语言:javascript
运行
复制
Not allowed to create transaction on shared EntityManager - use Spring 
transactions or EJB CMT

DAOImpl

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
<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>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-13 06:12:25

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

另外,删除entityManager.getTransaction().commit();语句,因为现在所有事务管理都将在spring之前处理,如果您保留该语句,那么您将再次得到相同的错误。

票数 59
EN

Stack Overflow用户

发布于 2018-11-09 05:19:38

在方法上注入EntityManagerFactory而不是EntityManager和javax.transaction.Transactional注释解决了我的问题,如下所示。

代码语言:javascript
运行
复制
//Autowire EntityManagerFactory
@PersistenceUnit(unitName = "readwrite.config")
private EntityManagerFactory entityManagerFactory;


//Use below code on create/update
EntityManager entityManager = entityManagerFactory.createEntityManager();

entityManager.getTransaction().begin();
if (!ObjectUtils.isEmpty(entity) && !entityManager.contains(entity)) {
   entityManager.persist(entity);
   entityManager.flush();
}
entityManager.getTransaction().commit();
票数 27
EN

Stack Overflow用户

发布于 2020-02-16 09:27:52

您需要删除entityManager.getTransaction().begin() and annotate the method using @Transactional语句吗?它允许在Spring之前进行事务处理。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17860696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档