【问题标题】:Java JDBC transactional multi table insertJava JDBC事务多表插入
【发布时间】:2015-09-28 05:53:23
【问题描述】:

假设我们有一个结构如下的数据库:

  • 表格新闻:包含有关新闻的数据
  • 表作者:包含有关作者的数据
  • 在两个表之间我们有一个多对多的关系,所以我们需要一个联结表;我们称之为 News_Authors_Junction_Table

假设我们为每个重要的表都有一个 DAO:NewsDAO、AuthorsDAO。 每个 DAO 都有一个插入方法。在插入方法开始时,获取连接,然后关闭。另外,假设我们有一个连接管理器类,它处理与数据库的连接并使用单例模式进行连接。基本上每次返回相同的连接。

现在问题来了。考虑到当我们必须插入新闻时,我们也必须插入作者。这意味着我们需要一个事务。

在NewsDAO的插入方法中,我们获取连接,设置它的自动提交为false,调用AuthorsDAO的插入方法,设置连接的自动提交为true,然后关闭连接。但是,正如我之前提到的,在每个插入方法中,我们获取连接然后关闭它。并且因为我们有一个插入方法到另一个插入方法中,所以在内部插入方法中连接是关闭的。

有没有办法解决这个问题?

【问题讨论】:

    标签: java mysql hibernate jdbc


    【解决方案1】:

    您可以做的是,将您的事务管理移出您的 DAO。编写一个服务层,它将封装您所有的 DAO 调用,并在服务方法的开头启动您的事务并在最后关闭它。

    因此,在您的情况下,您将拥有一个服务类,例如 NewsService,其中您将拥有一个方法 createNews()。下面是一个骨架代码。我还没有研究语法,但把它放在代码中给你一个想法。

    public XXReturnXX createNews(){
         Transaction tx = DAOHelper.createTx();
    
         NewsDao newsDAO.insertNews(tx,..);
         AuthorDAO authorDAO.insertAuthor(tx,..)
    
         tx.commit()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 2023-03-16
      • 2016-08-15
      • 2012-08-14
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多