我们假设我们的数据库结构如下:
假设我们为每个重要的表都有一个DAO:NewsDAO,AuthorsDAO。 每个DAO都有一个插入方法。在插入方法开始时,获取连接,然后关闭。另外,假设我们有一个连接管理器类,它处理与数据库的连接并使用Singleton模式进行连接。基本上每次返回相同的连接。
现在出现了问题。考虑到当我们必须插入新闻时,我们还必须插入作者。这意味着我们需要一个交易。
在NewsDAO插入方法中,我们获取连接,将其自动提交设置为false,调用AuthorsDAO插入方法,将连接的自动提交设置为true,然后关闭连接。但是,正如我之前提到的,在每个插入方法中,我们获取连接然后关闭它。因为我们在另一个插入方法中有一个insert方法,所以在内部插入方法中关闭了连接。
这个问题有解决方案吗?
答案 0 :(得分:1)
您可以做的是,将您的交易管理移出DAO。编写一个服务层,它将封装所有DAO调用,并在服务方法开始时启动您的事务,并在结束时关闭它。
因此,在您的情况下,您将拥有一个服务类,例如NewsService,您将在其中使用createNews()方法。下面是一个骨架代码。我没有研究过语法,但是以代码方式将它放在了一个想法中。
public XXReturnXX createNews(){
Transaction tx = DAOHelper.createTx();
NewsDao newsDAO.insertNews(tx,..);
AuthorDAO authorDAO.insertAuthor(tx,..)
tx.commit()
}