我有2个存储库 - 每个存储库都有针对不同对象的保存方法。 我想执行这两个方法作为事务,这意味着如果其中一个失败,事务将被回滚。 (这在我看来是交易的意义)。如何在@Transactional中实现春季真正的交易
这里是我的代码:
@Repository
public class BananaRep {
private JdbcTemplate jdbc;
@Autowired
public BananaRep(JdbcTemplate jdbc) {
this.jdbc = jdbc;
}
public void saveBanana(Banana banana) {
jdbc.update("insert into ......", ...);
}
}
@Repository
public class TomatoRep {
private JdbcTemplate jdbc;
@Autowired
public TomatoRep(JdbcTemplate jdbc) {
this.jdbc = jdbc;
}
public void saveTomato(Tomato tomato) {
jdbc.update("insert into ... ", ....);
}
}
@RestController
public class MixController {
@Autowired
BananaRep bananaRep;
@Autowired
TomatoRep tomatoRep;
@Transactional
@RequestMapping(value="/mix", method= RequestMethod.GET)
public Car mix() {
Banana banana = new Banana(....);
bananaRep.saveBanana(banana);
Tomato tomato= new Tomato(...);
tomatoRep.saveTomato(tomato);
return banana;
}
}
我的构建:
buildscript {
ext {
springBootVersion = '2.0.0.M2'
}
repositories {
mavenCentral()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-jersey')
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.boot:spring-boot-starter-jdbc')
compile('mysql:mysql-connector-java')
}
为了测试它,我在我的控制器saveTomato改变一个数据库列的名称在番茄台,所以(番茄)方法会失败。如果发生这种情况,我想要保存的香蕉回滚。我认为它应该像@Transactional方法注释一样工作,但我错了。
那么如何实现我的目标呢?
你不使用弹簧引导,是吗?如果没有,你是否声明了'DataSourceTransactionManager'?请显示你的配置。 – alfcope
请保持会话工厂和事务对象。 –
您是使用'@ EnableAutoConfiguration'创建数据源吗?你应该有一个由Spring自动创建的'DataSourceTransactionManager' bean。 – alfcope