gpt4 book ai didi

java - 在Spring 4.1.5中配置事务而不使用XML

转载 作者:行者123 更新时间:2023-12-02 20:58:17 30 4
gpt4 key购买 nike

我正在编写与 Oracle 数据库连接的应用程序。我从数据库调用函数,将新记录插入表中。在这个回调之后,我可以决定我想要做什么:提交或回滚。

不幸的是,我是 Spring 的新手,所以我在配置方面遇到了问题。而且我想在 Java 类中进行此配置,而不是在 XML 中。我在这里需要你的帮助。

更新代码:

ApplicationConfig代码:

@Configuration
@EnableTransactionManagement
@ComponentScan("hr")
@PropertySource({"classpath:jdbc.properties", "classpath:functions.properties", "classpath:procedures.properties"})
public class ApplicationConfig {

@Autowired
private Environment env;

@Bean(name="dataSource")
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(env.getProperty("jdbc.driver"));
dataSource.setUrl(env.getProperty("jdbc.url"));
dataSource.setUsername(env.getProperty("jdbc.username"));
dataSource.setPassword(env.getProperty("jdbc.password"));
dataSource.setDefaultAutoCommit(false);
return dataSource;
}

@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.setResultsMapCaseInsensitive(true);
return jdbcTemplate;
}

@Bean(name="txName")
public PlatformTransactionManager txManager() {
DataSourceTransactionManager txManager = new DataSourceTransactionManager();
txManager.setDataSource(dataSource());
return txManager;
}
}

我有 Dao 和 Service,它们都实现了正确的接口(interface)。

服务实现:

@Service
public class HumanResourcesServiceImpl implements HumanResourcesService {

@Autowired
private HumanResourcesDao hrDao;

@Override
public String generateData(int rowsNumber) {
return hrDao.generateData(rowsNumber);
}

@Override
@Transactional("txName")
public void shouldCommit(boolean doCommit, Connection connection) throws SQLException {
hrDao.shouldCommit(doCommit, connection);
}
}

Dao 实现:

@Repository
public class HumanResourcesDaoImpl implements HumanResourcesDao {

private JdbcTemplate jdbcTemplate;
private SimpleJdbcCall generateData;

@Autowired
public HumanResourcesDaoImpl(JdbcTemplate jdbcTemplate, Environment env) {
this.jdbcTemplate = jdbcTemplate;
generateData = new SimpleJdbcCall(jdbcTemplate)
.withProcedureName(env.getProperty("procedure.generateData"));
}

@Override
public String generateData(int rowsNumber) {
HashMap<String, Object> params = new HashMap<>();
params.put("i_rowsNumber", rowsNumber);
Map<String, Object> m = generateData.execute(params);
return (String) m.get("o_execution_time");
}

@Override
@Transactional("txName")
public void shouldCommit(boolean doCommit, Connection connection) throws SQLException {
if(doCommit) {
connection.commit();
} else {
connection.rollback();
}
}
}

主类代码:

public class Main extends Application implements Initializable {
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);

hrService = context.getBean(HumanResourcesService.class);

BasicDataSource ds = (BasicDataSource)context.getBean("dataSource");
Connection connection = ds.getConnection();

//do something and call
//hrService.generateData
//do something and call
//hrService.shouldCommit(true, connection);
//which commit or rollback generated data from previoues callback
}
}

更新:

我认为问题出在连接上,因为这个语句:

this.jdbcTemplate.getDataSource().getConnection();

创建新连接,因此无需提交或回滚任何内容。但我仍然不明白为什么这不能正常工作。没有错误,没有新记录...奇怪的是,当我调试 connection.commit(); 时,我发现在 DelegatingConnection.java 中,参数 this 具有正确的连接,但有类似以下内容:

_conn.commit();

_conn有不同的连接。为什么?

我应该以某种方式同步这两种方法的连接还是什么?或者这只是一个连接?老实说,我不确定它到底是如何工作的。一个连接和对存储过程的所有回调都在此连接中,或者可能每个回调都会创建新连接?

真正的问题是如何提交或回滚来自先前回调的插入到表中的数据?

最佳答案

实现此目的的一种简单方法是使用 @Transactional 注释该方法:

@Transactional
public void myBeanMethod() {
...
if (!doCommit)
throw new IllegalStateException(); // any unchecked will do
}

Spring 将回滚所有数据库更改。

记住将@EnableTransactionManagement添加到您的Spring应用程序/主类

关于java - 在Spring 4.1.5中配置事务而不使用XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29177344/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com