ActiveObjectsでH2を使うには
DatabaseProvider#getInstance()を参照すると以下の記述が。
SupportedDBProvider provider = SupportedDBProvider.getProviderForURI(uri); if (provider == null) { throw new RuntimeException("Unable to locate a valid database provider for URI: " + uri); }つまり、SupportedDBProviderがちゃんと取れてないんですね。
じゃぁ、そっちを見ましょう、と言うことで見てみます。SupportedDBProviderではEnumを拡張して対応しているDBかどうかをチェックしている模様。
その中にH2が含まれていないのですね。結果、DatabaseProvider様が「んなDB知るか!!!」とのたまっているのですね。お気持ちはわかります。
Wicket + Guice + ActiveObjects + H2ができない - kirikenの日記
このエントリに対し、僕はLDCで「SupoprtedDBProvider自体も書き換えたような記憶が」って書きました。
気になったので、もっかい見なおしてみたら、そんなこともする必要なくて、
new EntityManager(H2DatabaseProvider.getInstance("jdbc:h2:file:hogehoge", "sa", ""))
を、
new EntityManager(new H2DatabaseProvider("jdbc:h2:file:hogehoge", "sa", ""))
にすればいいだけっぽい。
どういうことかというと、DatabaseProvider#getInstanceは、上で引用してる部分で、サポートしてるDBかどうかチェックしたあとにSupportedDBProvider#createInstanceを呼んでるんだけど、こいつが実際に使用しようとしてるDatabaseProviderをインスタンス化してる。
Constructor constructor = type.getDeclaredConstructor(new Class[] {
java/lang/String, java/lang/String, java/lang/String
});
constructor.setAccessible(true);
back = (DatabaseProvider)constructor.newInstance(new Object[] {
uri, username, password
});
こんな感じでね。これって要は、コンストラクタ呼びだしてるだけだよね。んでこのbackを呼びだし元に返してるだけなので、結局はnewしてるのと変わらない。
ま、poolingするときは、このbackを利用可能なpoolProviderに入れて返してるんで、poolingしたい場合にはSupoprtedDBProviderを書き換えるしかないかもだけど。
というわけで、
new EntityManager(new H2DatabaseProvider("jdbc:h2:file:hogehoge", "sa", ""))
でやってみてくださいな。
ってか、H2使うなら、ActiveObjectsよりもJaQu(H2に付属のORM)使うほうが楽しいと思うけどねー。
Comments(0)