1. 概要

このクイックチュートリアルでは、JPA対応のSpring BootアプリケーションでSQLiteデータベースを使用する手順を説明します。

Spring Boot は、いくつかのよく知られたインメモリデータベースをすぐにサポートしますが、SQLiteにはもう少し多くのものが必要です。

何が必要か見てみましょう。

2. プロジェクトの設定

説明のために、最初にSpring Data過去のチュートリアルで使用したRESTアプリから始めます。

pomで、sqllite-jdbc依存関係を追加する必要があります。

<dependency>
    <groupId>org.xerial</groupId>
    <artifactId>sqlite-jdbc</artifactId>
    <version>3.25.2</version>
</dependency>

この依存関係により、SQLiteと通信するためにJDBCを使用するために必要なものが得られます。 ただし、 ORMを使用する場合は、それだけでは不十分です。

3. SQLite方言

HibernateにはSQLiteのダイアレクトは付属していません。を参照してください。 自分で作成する必要があります。

3.1. 方言を拡張する

最初のステップは、 org.hibernate.dialect.Dialect クラスを拡張して、SQLiteによって提供されるデータ型を登録することです。

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列のサポート

たとえば、SQLiteが@Id列を処理する方法をHibernateに指示する必要があります。これは、カスタム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列の型を整数のみに保ちましょう。 そして、次に利用可能なID値を取得するために、適切なメカニズムを指定します。

次に、成長するSQLiteDialectクラスの対応するメソッドをオーバーライドするだけです。

@Override
public IdentityColumnSupport getIdentityColumnSupport() {
    return new SQLiteIdentityColumnSupport();
}

3.3. 制約処理を無効にする

また、 SQLiteはデータベースの制約をサポートしていないため、主キーと外部キーの両方に適切なメソッドを再度オーバーライドして、これらのを無効にする必要があります。

@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 "";
}

そして、すぐに、Spring Boot構成でこの新しい方言を参照できるようになります。

4. DataSource構成

また、 Spring BootはそのままのSQLiteデータベースの構成サポートを提供しないため、独自の 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.baeldung.dialect.SQLiteDialect
hibernate.hbm2ddl.auto=create-drop
hibernate.show_sql=true

複数のデータベース接続でデータベースの更新を表示し続けるには、キャッシュをsharedとして保持する必要があることに注意してください。

したがって、上記の構成では、アプリが起動し、 myDb というインメモリデータベースを起動します。このデータベースは、残りの Spring DataRest構成が使用できます。 。

5. 結論

この記事では、サンプルのSpring Data Restアプリケーションを取得し、SQLiteデータベースに向けました。 ただし、そのためには、カスタムのHibernate方言を作成する必要がありました。

Githubでアプリケーションを確認してください。 mvn -Dspring.profiles.active = sqlite spring-boot:run で実行し、 http:// localhost:8080を参照するだけです。