こんにちわ、みけです。
先週の金曜(2014/08/01)にJGGUG主催の
ドキッおっさんだらけのGrails 3.0先取り!?Spring Boot入門ハンズオン
に行ってきました。
なお、この勉強会のツイートなどは、多分まとめられてると思います|д゚)チラッ
また、参加者の皆さんのブログなども多数あると思います|д゚)チラッ
ので、僕の興味の範囲でダラダラと書いています。
Spring Bootでファイルベースのデータベースを使う
unitテストなどでデータベースを扱う場合、
ファイルベースのデータベースのほうが何かと便利だったりします。
テスト前にデータベースに大量にデータを入れる場合などは、
事前に準備しておいたデータベースを
どかーんと持ってきたほうが楽ですし、楽ですし、楽だったりします。
というわけで、このハンズオンでもh2のファイルベースのデータベースを
使った演習をしました。
ただ僕の場合、天邪鬼な性格が災いして、
わざわざh2落としてこなくても、
Java DBでいいじゃんと考えて、
Java DBでやることにしました。
設定の記述
Java DBを使う場合、application.ymlで次のように記述します。
spring: datasource: driverClassName: org.apache.derby.jdbc.EmbeddedDriver url: jdbc:derby:/path/to/database.db username: sa password: sa jpa: hibernate: ddl-auto: update
で、勉強会の資料では、
ファイルの実態がない場合には作成されるということで、
このまま実行したところ…
$ gradle bootRun ...省略... java.sql.SQLException: データベース'/Users/mike/IdeaProjects/spring-boot-self-learning/database.db'が見つかりません。 at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source) at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source) at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source) at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source) at org.apache.derby.impl.jdbc.EmbedConnection.newSQLException(Unknown Source) at org.apache.derby.impl.jdbc.EmbedConnection.handleDBNotFound(Unknown Source) at org.apache.derby.impl.jdbc.EmbedConnection.<init>(Unknown Source) at org.apache.derby.impl.jdbc.EmbedConnection40.<init>(Unknown Source) at org.apache.derby.jdbc.Driver40.getNewEmbedConnection(Unknown Source) at org.apache.derby.jdbc.InternalDriver.connect(Unknown Source) at org.apache.derby.jdbc.Driver20.connect(Unknown Source) at org.apache.derby.jdbc.EmbeddedDriver.connect(Unknown Source) ...省略... :bootRun FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':bootRun'. > Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1 * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. BUILD FAILED Total time: 13.69 secs
という感じで落ちてしまいました。
ファイルなければ作ってくれる言うたのに…(´・ω・`)
解決策
url
に;create=true
を追加するとイケます。
spring: datasource: driverClassName: org.apache.derby.jdbc.EmbeddedDriver url: jdbc:derby:/path/to/database.db;create=true username: sa password: sa jpa: hibernate: ddl-auto: update
なければ作ってくれるとは一体何だったのか…
Gradleの記述
Java DBは$JAVA_HOME/db/lib
の下にあるderby.jar
なので、
これをcompile configurationに追加します。
apply plugin: 'idea' // 他のプラグインは省略 dependencies { compile files("${System.getenv('JAVA_HOME')}/db/lib/derby.jar") // 他のdependenciesは省略 }
あれれれれ?!
なお、このgradleプロジェクトでideaタスクを実行した後に、
intellij ideaで開くと、
お、これ、gradleプロジェクトだね?gradleプロジェクトとして読み込む?
とintellijに聞かれるので、これに応じると…
せっかくcompile configurationに入れたderby.jarが消えていなくなります。
どうやら、configurationのfilesにintellijちゃんは対応していないようです(´・ω・`)
なので、Java DBを使う場合は、gradleプロジェクトとしては認識させないようにしておいたほうが
良さそうですね|д゚)チラッ
おわり