在单个事务中将数据保留在多个表中

时间:2012-04-05 08:40:24

标签: hibernate hibernate-session

在下面的代码片段中,我试图坚持两个实体 - Account和AccountDetails。我希望这是原子的。这意味着,Account和AccountDetails entites都应该保存在一个事务中。我无法实现它。

请注意,AccountDetails表使用外键(account.id)引用Account表。

如果我尝试将它们保留在同一个事务中,我会遇到死锁。否则,我需要两个不同会话的不同交易。

        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. 如何避免死锁?为什么会发生死锁?毕竟,从逻辑上讲, AccountDetails 不需要锁定帐户就可以保留。

1 个答案:

答案 0 :(得分:0)

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