HibernateDaoSupport と jdbcExceptionTranslator

以前、HibernateDaoSupport で jdbcExceptionTranslator を入れ替えたいときに、setterベースではどうするとスマートかが棚上げになっていたので少しだけ考えてみた。

最初の applicationContext.xml (一部)(id:ferreco:20040316#p1)

  
    
  

  
    
    
  

何が問題かというと、hogeDao に jdbcExceptionTranslator を set するときには、

  • sessionFactory を set する
  • 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 (一部)

  
    
  

  
    
    
  

  
    
  

ちょっと考えれば簡単でした。