HibernateDaoSupport と jdbcExceptionTranslator
以前、HibernateDaoSupport で jdbcExceptionTranslator を入れ替えたいときに、setterベースではどうするとスマートかが棚上げになっていたので少しだけ考えてみた。
最初の applicationContext.xml (一部)(id:ferreco:20040316#p1)
何が問題かというと、hogeDao に jdbcExceptionTranslator を set するときには、
- sessionFactory を set する
- setSessionFactory で hibernateTemplate がインスタンス化される
- jdbcExceptionTranslator を set する
- setJdbcExceptionTranslator で hibernateTemplate に jdbcExceptionTranslator が set される。
という流れになるのだ。これは美しくない。なお、実際に動かした場合は、ちゃんと定義した順番に setter が呼び出されており、例外等は起こらない。当然、コンストラクタベースなら処理順序を好きに実装すればよいので問題ない。
id:dotさんの指摘により depends-on 属性をつけられないか考えてみる。
この場合、jdbcExceptionTranslator が sessionFactory(正確にはhibernateTemplate)に依存していることになる。ところで、depends-on 属性は bean 要素に設定するもののようだ。これではどこにも depends-on 属性をつけられない。
dependency-check 属性でチェックできないか考えてみる
dependency-check 属性で、依存するプロパティのチェックができるようだ。しかし、これも Bean 属性にしか設定できない。プロパティの設定順序は指定できない。
そもそも、Bean間の依存関係が絡まっていること自体が問題なようだ。交通整理を試みる
- SessionFactory は HibernateAccessor に使用される
- SQLExceptionTranslator は HibernateAccessor に使用される
- HiternateTemplate は HibernateAccessor のサブクラスである
上記より、hibernateTemplate は sessionFactory と jdbcExceptionTranslator に依存する
- HibernateDaoSupport は HibernateTemplate に依存する
- HibernateHogeDao は HibernateDaoSupport のサブクラスである
上記より、hogeDao は hibernateTemplate に依存する
何のことは無い、hogeDao に sessionFactory を set するのをやめて、hibernateTemplate という Bean を新しく定義するだけであるべき姿に持っていけるではないか。
正しい applicationContext.xml (一部)
ちょっと考えれば簡単でした。