java - 带有嵌套事务的 Spring JpaTransactionManager

标签 java spring hibernate transactions

我有以下 Spring 配置。

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

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



<bean id='entityManagerFactory'
    class='org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean'>
    <property name="persistenceUnitName" value="test" />
    <property name='dataSource' ref='dataSource' />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="true" />
             <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect"/>
        </bean>
    </property>
</bean>


<bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
 <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  <property name="url" value="jdbc:mysql://localhost:3306/testdb" />
  <property name="username" value="test" />
  <property name="password" value="test" />
</bean>

我创建了以下实体。

@Entity(name="testtable")
public class Testtable implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(unique=true, nullable=false)
private int testid;

@Column(length=10)
private String description;

public Testtable() {
}

public int getTestid() {
    return this.testid;
}

public void setTestid(int testid) {
    this.testid = testid;
}

public String getDescription() {
    return this.description;
}

public void setDescription(String description) {
    this.description = description;
}

}

现在我想使用此设置测试嵌套事务行为。所以我创建了以下测试类。

@TransactionConfiguration(defaultRollback=false)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:context-test.xml")
public class TableTest {

@Autowired
private TesttableRepository testtableRepository;

@Test
@Transactional
public void testMethod()
{
    Testtable entry = new Testtable();
    entry.setDescription("ABC");
    entry = testtableRepository.save(entry);
    TestObj t = new TestObj(testtableRepository);

    t.testNestedTransactional();


entry.setDescription("ABCEE");
 testtableRepository.save(entry);
assertNotNull(entry.getTestid());
}


}

public class TestObj {

public TestObj(TesttableRepository testtableRepository){
    this.testtableRepository = testtableRepository;
}

private TesttableRepository testtableRepository;

@Transactional(propagation=Propagation.NESTED )
public void testNestedTransactional(){
    Testtable entry1 = new Testtable();

        entry1.setDescription("RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR");
         testtableRepository.save(entry1);

}

TestObj.java 中的 testNestedTransactional() 方法应该失败,因为违反了数据库约束(字段描述的最大长度为 10)。即使此方法失败,我仍希望将“ABCEE”值保存在数据库中。这对嵌套事务行为是否正确?我怎样才能实现这个目标?

最佳答案

问题是您手动创建了 TestObj。您应该使用 Spring 上下文来执行此操作(在上下文中将其声明为 bean 并在测试中 Autowiring )。

Spring 会将此 bean 包装在代理中以使其具有事务性。在您的情况下,它是一个没有事务行为的普通旧 Java 对象。

关于java - 带有嵌套事务的 Spring JpaTransactionManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27395140/

相关文章:

java - Callable 中的 Guice DI

Spring Boot JPA 多数据源错误

java - Spring boot @ResponseBody 不序列化实体 id

hibernate - Grails 2.4 + Hibernate 4 + 可搜索插件 = ClassNotFoundException : org. hibernate.impl.SessionFactoryImpl

java - 重命名 hibernate envers id 和 timestamp 列

java - 循环在要求用户输入新输入之前执行所有操作,而不是仅仅按照应有的方式重新请求

java - Gradle-将依赖项与 Artifact 中的其他项目一起使用

java - Android JAVA从php获取数组

java - 如何从Java中的List数组中获取格式化字符串?

java - 加速 hibernate 初始化