SQLiteを使用したSpring Boot
1. 概要
このクイックチュートリアルでは、JPA対応のSpring BootアプリケーションでSQLiteデータベースを使用する手順を説明します。
Spring Bootsupports a few well known in-memory databasesはすぐに使用できますが、SQLiteにはもう少し必要です。
何が必要か見てみましょう。
2. プロジェクトのセットアップ
説明のために、we’ll start with a Spring Data Rest app we’ve used in past tutorials.
pomで、sqllite-jdbcの依存関係を追加する必要があります。
org.xerial
sqlite-jdbc
3.25.2
この依存関係により、SQLiteと通信するためにJDBCを使用するために必要なものが得られます。 しかし、if we are going to use an ORM, it’s not enough.
3. SQLite方言
Hibernate doesn’t ship with a Dialect for SQLiteを参照してください。 自分で作成する必要があります。
3.1. Dialectの拡張
最初のステップは、org.hibernate.dialect.Dialectクラスを拡張して、SQLiteによって提供されるdata typesを登録することです。
public class SQLiteDialect extends Dialect {
public SQLiteDialect() {
registerColumnType(Types.BIT, "integer");
registerColumnType(Types.TINYINT, "tinyint");
registerColumnType(Types.SMALLINT, "smallint");
registerColumnType(Types.INTEGER, "integer");
// other data types
}
}
いくつかありますので、残りのサンプルコードを必ずチェックしてください。
次に、いくつかのデフォルトのDialectの動作をオーバーライドする必要があります。
3.2. ID列のサポート
たとえば、we need to tell Hibernate how SQLite handles @Id columnsは、カスタムのIdentityColumnSupport実装で実行できます。
public class SQLiteIdentityColumnSupport extends IdentityColumnSupportImpl {
@Override
public boolean supportsIdentityColumns() {
return true;
}
@Override
public String getIdentitySelectString(String table, String column, int type)
throws MappingException {
return "select last_insert_rowid()";
}
@Override
public String getIdentityColumnString(int type) throws MappingException {
return "integer";
}
}
ここでは簡単にするために、ID列の型をIntegerのみに保ちましょう。 次に利用可能なID値を取得するために、適切なメカニズムを指定します。
次に、成長するSQLiteDialectクラスの対応するメソッドをオーバーライドするだけです。
@Override
public IdentityColumnSupport getIdentityColumnSupport() {
return new SQLiteIdentityColumnSupport();
}
3.3. 制約処理を無効にする
そして、SQLite doesn’t have support for the database constraints, so we’ll need to disable thoseは、主キーと外部キーの両方に適切なメソッドを再度オーバーライドします。
@Override
public boolean hasAlterTable() {
return false;
}
@Override
public boolean dropConstraints() {
return false;
}
@Override
public String getDropForeignKeyString() {
return "";
}
@Override
public String getAddForeignKeyConstraintString(String cn,
String[] fk, String t, String[] pk, boolean rpk) {
return "";
}
@Override
public String getAddPrimaryKeyConstraintString(String constraintName) {
return "";
}
そして、すぐに、SpringBoot構成でこの新しい方言を参照できるようになります。
4. DataSource構成
また、Spring Boot doesn’t provide configuration support for SQLite database out of the boxなので、独自のDataSourceBeanも公開する必要があります。
@Autowired Environment env;
@Bean
public DataSource dataSource() {
final DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("driverClassName"));
dataSource.setUrl(env.getProperty("url"));
dataSource.setUsername(env.getProperty("user"));
dataSource.setPassword(env.getProperty("password"));
return dataSource;
}
最後に、persistence.propertiesファイルで次のプロパティを構成します。
driverClassName=org.sqlite.JDBC
url=jdbc:sqlite:memory:myDb?cache=shared
username=sa
password=sa
hibernate.dialect=com.example.dialect.SQLiteDialect
hibernate.hbm2ddl.auto=create-drop
hibernate.show_sql=true
複数のデータベース接続でデータベースの更新を表示し続けるには、キャッシュをsharedとして保持する必要があることに注意してください。
So, with the above configurations, the app will start and will launch an in-memory database called myDb。残りのSpring Data Rest構成が占める可能性があります。
5. 結論
この記事では、サンプルのSpring Data Restアプリケーションを取り上げ、それをSQLiteデータベースに向けました。 ただし、そのためには、カスタムのHibernateダイアレクトを作成する必要がありました。
アプリケーションover on Githubを必ずチェックしてください。 mvn -Dspring.profiles.active=sqlite spring-boot:run で実行し、http://localhost:8080を参照するだけです。