The DaoManager
provides methods for working
with connection and transaction. These methods allow you to demarcate
connection/transactions and avoid having to pass transaction objects, like
IDbTransaction
, around to all of your DAOs.
Example 5.6. Example DAO transaction management
[C#] Product p1 = new Product(); Product p2 = new Product(); Category c 1= new Category() c1.Add(p1); c2.Add(p2); IDaoManager daoManager = DaoManager.GetInstance("PetStore"); ICategoryDao categoryDao = daoManager[typeof(ICategoryDao)] as ICategoryDao; IProductDao productDao = daoManager[typeof(IProductDao)] as IProductDao; try { daoManager.BeginTransaction(); productDao.Insert(p1); productDao.Insert(p2); categoryDao.Insert(c1); daoManager.CommitTransaction(); } catch { daoManager.RollBackTransaction(); }
Calling BeginTransaction()
lets the
DaoManager
know that you are interested in managing
transactions programmatically. It is very important that you guarantee a
call to RollBackTransaction()
if you’ve called
BeginTransaction()
, which is why it is within the
catch
block. The call to
RollBackTransaction()
will rollback any changes
you’ve made in case an exception is thrown before the call to
CommitTransaction()
. Be aware that if an
exception occurs before BeginTransaction()
completes and is caught in the catch
block,
RollBackTransaction() will also throw another exception since a
transaction was not started.
When you deal with a connection and transaction, you can also use
the using
syntax as in the examples below.
[C#] IDaoManager daoManager = DaoManager.GetInstance("PetStore"); IAccountDao accountDao = daoManager[typeof(IAccountDao)] as IAccountDao; using ( IDalSession session = daoManager.OpenConnection() ) { Account account = NewAccount(); accountDao.Create(account); } using ( IDalSession session = daoManager.BeginTransaction() ) { Account account = NewAccount(); Account account2 = accountDao.GetAccountById(1); account2.EmailAddress = "someotherAddress@somewhere.com"; accountDao.Create(account); accountDao.Update(account2); session.Complete(); // Commit }