Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring数据jpa事务在服务上不起作用_Spring_Jpa_Spring Data_Transactional - Fatal编程技术网

Spring数据jpa事务在服务上不起作用

Spring数据jpa事务在服务上不起作用,spring,jpa,spring-data,transactional,Spring,Jpa,Spring Data,Transactional,以下是我的服务方法: @Resource private PersonRepository personRepository; @Transactional @Override public Person create(PersonDTO created) { LOGGER.debug("Creating a new person with information: " + created); Person person = Person.getBuilder(created

以下是我的服务方法:

@Resource
private PersonRepository personRepository;

@Transactional
@Override
public Person create(PersonDTO created) {
    LOGGER.debug("Creating a new person with information: " + created);

    Person person = Person.getBuilder(created.getFirstName(), created.getLastName()).build();

    personRepository.save(person);

    foo();

    return null;
}
public void foo() {
    throw new RuntimeException();
}
正如你所看到的,我扔下了一个Exection,但是坚持发生了

以下是我的数据源配置:

<tx:annotation-driven transaction-manager="transactionManager"  proxy-target-class="true" />
 <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/dbb"/>
    <property name="username" value="root" />
    <property name="password" value="pass" />
    <property name="initialSize" value="10"/>
    <property name="maxActive" value="100"/>
    <property name="maxIdle" value="15"/> 
    <property name="minIdle" value="10"/> 
    <property name="timeBetweenEvictionRunsMillis" value="10000"/> 
    <property name="minEvictableIdleTimeMillis" value="60000"/> 
    <property name="validationQuery" value="/* ping */ SELECT 1"/>
    <property name="testOnBorrow" value="true"/> 
    <property name="testWhileIdle" value="true"/>           
    <property name="removeAbandoned" value="true"/> 
    <property name="removeAbandonedTimeout" value="300"/> 
</bean>

  <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="punit"/>
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaDialect">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
    </property>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="database" value="MYSQL"/>
            <!-- <property name="databasePlatform" value="${hibernate.dialect}"/> -->
            <property name="showSql" value="false"/>               
            <property name="generateDdl" value="false"/>
            <!--  <property name="hibernate.connection.autocommit" value="false"/> -->
        </bean>
    </property>
    <property name="jpaPropertyMap">
        <map>
            <entry key="hibernate.connection.autocommit" value="false" />
        </map>
    </property>
</bean> 

知道为什么吗


谢谢

您必须抛出
Spring
TransactionSystemException
。否则,您必须抛出扩展TransactionSystemException的自己的异常

例如:

import org.springframework.transaction.TransactionSystemException;

public class SystemException extends TransactionSystemException {
    public SystemException(String message) {
        super(message);
    }

    public SystemException(String message, Throwable throwable) {
        super(message, throwable);
    }
}

public void foo() {
    throw new SystemException("System Error!");
}   

重复的服务实例(一个有事务,一个没有事务)或MySQL和MyISAM表(不支持事务)。请注意您的配置
hibernate。当您注入
DataSource
时,connection
属性不会做任何事情(但会弄乱您的XML)。我们使用的是INNODB,为什么您认为我有一个重复的服务?您不会是第一个。如果使用组件扫描,请确保
ContextLoaderListener
DispatcherServlet
不扫描相同的组件。另外,请确保在指定了
的上下文中加载服务。M.Denium,谢谢它的工作原理,我扫描了两次组件。不,您没有。。。Springs事务管理遵循与EJB规范相同的语义,并且默认情况下对所有运行时异常进行回滚。请参阅参考指南的第页。默认情况下,每个RuntimeException都会回滚