Chonaso's Commentary

InternetやIT技術などについて知ったこと、試したこと、考えたことを書いていきます。

Domaで複数データベースを扱う

きちんと探せばサンプルありそうな気がするんですが、こんな感じで解決しました、という一例として残しておきます。


Domaを使い始めて2年以上経ってるはずなんですが、振り返ると複数データソースは初めてでした。

daoやentityのパッケージングはどうしたものかなぁ、という課題を残しつつもとりあえず2つのデータベースを同時に扱えるようにConfigクラスやbuild.gradleを2つ準備してDoma-genまで上手く行ったのでアプリ起動!

と思ったらエラー。

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.seasar.doma.jdbc.Config] is defined: expected single matching bean but found 2: HogeDatabaseConfig,FooDatabaseConfig

まだSpringは慣れてないけど、DI候補が2つあるからDIできないぞ、と怒られているというのは何となくわかりました。

問題の箇所はDAOから生成されたクラス(XxxDaoImpl)内のコンストラクタで、ConfigをDIしようとしている部分です。

    /**
     * @param config the config
     */
    @org.springframework.beans.factory.annotation.Autowired()
    public HogeDaoImpl(org.seasar.doma.jdbc.Config config) {
        super(config);
    }

DBが一つなら型インジェクションが普通に決まるので問題無く動くのですが、 エラーメッセージにあるHogeDatabaseConfigとFooDatabaseConfigはそれぞれorg.seasar.doma.jdbc.Configを実装したクラスなので確かにこれは動かないですね。

ってことで、それぞれのConfigクラスに名前を付けて、 DAO側では@Qualifierでその名前を指定するようにしました。

その結果、自動生成部分はこのようになりました。

    @org.springframework.beans.factory.annotation.Autowired()
    public HogeDaoImpl(@org.springframework.beans.factory.annotation.Qualifier("HogeDatabaseConfig") org.seasar.doma.jdbc.Config config) {
        super(config);
    }

これできちんと動いたので、doma-genのdao.ftlも修正しておしまい。


追記

確かに!

ということで修正しました。