2012-04-05 39 views
0

在下面的代码片段中,我尝试坚持两个实体 - Account和AccountDetails。我希望这是原子。意义上来说,Account和AccountDetails实体都应该保持在单个事务中。我无法实现它。在单个事务中在多个表中保留数据

请注意AccountDetails表引用帐户表与外键(account.id)。

如果我试着让它们在同一个事务中,我会陷入僵局。否则,我需要两次不同会话的不同交易。

 Account instance = (Account) transientInstance; 
     Set<AccountDetails> accountDetailses = instance.getAccountDetailses(); 
     AccountsHomeFactory factory = AccountsHomeFactory.getInstance(); 
     AccountDetailsHome accountDetailsDAO = (AccountDetailsHome) factory.getDAO("AccountDetails"); 

     transaction.begin(); 
     sessionFactory.getCurrentSession().persist(instance); 

     transaction.commit(); 
        // get new session ands start the transaction. 
     transaction.begin(); 

     for (AccountDetails accountDetails : accountDetailses) { 
      accountDetailsDAO.persist(accountDetails); 
      log.debug("persist successful"); 
     } 

     log.debug("transaction commit"); 
     transaction.commit(); 

问题:

  1. 我怎样才能避免僵局?为什么在这里发生死锁?毕竟,逻辑上,帐户详细信息不需要锁定帐户将被保留。
+0

虽然我有一个解决会话和事务由个别数据访问对象照顾的地方,但我无法实现我所寻找的原子性。 – 2012-04-05 08:47:06

+0

实际上,您不能为一个以上的进程使用一个会话。该策略是一个过程的一个会话。您可以使用JPA实现,我的意思是entitymanagerfactory和entitymanager。你可以使用entitymanager进行很多过程。但我认为会议是不可能的。 – mbaydar 2012-04-05 19:29:53

+0

为功能表及其详细信息表创建事务处理没有意义。我永远不想分开这两个操作。如果我想在单个事务中对多个表进行更改,该怎么办?任何方式来做到这一点? – 2012-04-05 23:42:28

回答

0

我认为你想要做的事情是可能的。解决方案是一个会话的多个事务。你可以阅读this我希望这会有所帮助。

+0

嗯,你是对的。会话可以跨越交易。事务和会话需要集中处理,而不是将其留给数据对象或数据层实体。 感谢您的帮助。 – 2012-04-08 10:46:16

相关问题