1.概要

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

Spring Boot

そのままいくつかのよく知られたインメモリデータベース

をサポートしますが、SQLiteにはもう少し必要です。

それが取るものを見てみましょう。

2.プロジェクトの設定

説明のために、** 私たちは過去のチュートリアルで使用したhttps://github.com/eugenp/tutorials/tree/master/spring-data-rest[Spring Data Restアプリ]から始めます。

ポンポンでは、https://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22sqlite-jdbc%22%20AND%20g%3A%22org.xerial%22[]を追加する必要があります。

sqllite-jdbc

]依存関係:

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

この依存関係により、SQLiteと通信するためにhttps://static.javadoc.io/org.xerial/sqlite-jdbc/3.25.2/org/sqlite/JDBC.html[JDBC]を使用する必要があることがわかります。しかし、

私たちがORMを使うつもりなら、それは十分ではありません。

3. SQLiteの方言

  • HibernateはSQLite ** 用にhttps://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/dialect/Dialect.html[

    Dialect

    ]を同梱していません。私たちは自分自身を創造する必要があります。

3.1.

Dialect

を拡張する

最初のステップは、SQLiteが提供するhttps://www.sqlite.org/datatype3.html[data types]を登録するために

org.hibernate.dialect.Dialect

クラスを拡張することです。

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

ここでは物事を単純にするために、identity列の型を

Integer

のみにしましょう。次に利用可能な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データベースの設定をサポートしていません

ので、私たち自身の

DataSource

beanも公開する必要があります。

@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

    ** と呼ばれるインメモリデータベースを起動し起動します。取ることができます。

5.まとめ

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


over on Github

アプリケーションを必ずチェックしてください。

__mvn -Dspring.profiles.active = sqlite spring-boot:を実行して


http://localhost:8080__に移動します。