※ ChatGPTを利用し、要約された質問です(原文:ビジネスロジック層とDAO層の書き方)
ビジネスロジック層とDAO層の書き方
このQ&Aのポイント
ビジネスロジック層とDAO層の書き方について困っています。Aテーブルから取得した値をBテーブルとCテーブルにインサートする方法について、依存性の観点から改善方法を教えてください。
現在のビジネスロジック層の書き方では、DAOを直接newすることが依存性の観点からよくないとされています。Webで調べた結果、DAOパターンを使って疎結合にする方法が示されていますが、途中でのロールバックができないという問題があります。
一番最初に挙げたコードの方が、各々のDAOで同じコネクションを使い回し、最後に正常終了した段階でコミットするというわかりやすさがあります。改善策をお教えいただけますか。
現在、Webアプリを作成しているのですがビジネスロジックとDAOをどういうように
書けばいいのか困っています。
例えばAテーブルから取得した値を
BテーブルとCテーブルにインサート(途中でしくじったらロールバック)。
現在、ビジネスロジック層では下記のような調子で書いています。
しかし、ビジネスロジック層でDAOを直接newするのは依存性の観点から
よろしくないということなのですがどのように改善すればよろしいでしょうか。
また、皆様はどのような実装を行っていますでしょうか。
try {
DBConnect conn = getConnection();
A aDao = new A(conn);
String a = aDao.getData();
B bDao = new B(conn);
bDao.insert(a);
C cDao = new C(conn);
cDao.insert(a);
conn.commit();
} catch(Exception e) {
conn.rollback();
} finally {
conn.close();
}
Webを見ていたらDAOパターンを示した下記サイトがありました。
http://www.nulab.co.jp/designPatterns/designPatterns3/designPatterns3-4.html
上記サイトののコードに習うならば上記のビジネスロジックのコードは
下記のようになると思います。(各々のDAOの中でDBのConnection、Closeを行っている)
下記の場合、ビジネスロジックとDAOは疎結合になったかもしれませんが
cDao.insert()でしくじった場合、それより前の処理はロールバックできない
のではないかと思います。
また、一番最初に書いた記述方法の方が1つのコネクションを各々のDAOで使い回し
最後に正常終了した段階でコミットするというわかりやすさがあるので
一番最初に挙げたコードを改良できないかと思っています。
ItemDao aDao = DaoFactory.createADao(); //Aオブジェクト取得
String a = aDao.getData();
ItemDao bDao = DaoFactory.createBDao(); //Bオブジェクト取得
bDao.insert(a);
ItemDao cDao = DaoFactory.createCDao(); //Cオブジェクト取得
cDao.insert(a);
お礼
ご回答ありがとうございました。了解しました。