Archive for the 'H2' Category

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)使うほうが楽しいと思うけどねー。

次のページ »