Рубрики
Без рубрики

Весенняя Загрузка С SQLite

Настройте приложение Spring Boot с сохраняемостью SQLite

Автор оригинала: baeldung.

1. Обзор

В этом кратком руководстве мы рассмотрим шаги по использованию базы данных SQLite в приложении Spring Boot с поддержкой JPA.

Spring Boot поддерживает несколько хорошо известных баз данных в памяти из коробки, но SQLite требует от нас немного больше.

Давайте посмотрим, что для этого нужно.

2. Настройка проекта

Для нашей иллюстрации мы начнем с приложения Spring Data Rest , которое мы использовали в прошлых учебниках.

В pom нам нужно добавить зависимость sqlite-jdbc :


    org.xerial
    sqlite-jdbc
    3.25.2

Эта зависимость дает нам то, что нам нужно использовать JDBC для связи с SQLite. Но, если мы собираемся использовать ORM, этого недостаточно.

3. Диалект SQLite

Смотрите, Hibernate не поставляется с диалектом для SQLite . Нам нужно создать его самим.

3.1. Расширение диалекта

3.1. Расширение диалекта

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

Их несколько, поэтому обязательно ознакомьтесь с образцом кода для остальных.

Затем нам нужно будет переопределить некоторые стандартные Диалектные модели поведения.

3.2. Поддержка столбцов Идентификации

Например, нам нужно сообщить Hibernate , как SQLite обрабатывает @Id столбцы , что мы можем сделать с помощью пользовательской Поддержки столбцов идентификаторов реализации:

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 . И чтобы получить следующее доступное значение идентификатора, мы укажем соответствующий механизм.

Затем мы просто переопределяем соответствующий метод в нашем растущем классе 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 "";
}

И через мгновение мы сможем ссылаться на этот новый диалект в нашей конфигурации весенней загрузки.

4. Конфигурация источника данных

Кроме того, поскольку Spring Boot не обеспечивает поддержку конфигурации базы данных SQLite из коробки , нам также необходимо предоставить наш собственный источник данных 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

Обратите внимание, что нам нужно сохранить кэш как общий , чтобы обновления базы данных были видны через несколько подключений к базе данных.

Таким образом, с приведенными выше конфигурациями приложение запустится и запустит базу данных в памяти под названием myDb , которую может занять оставшаяся Spring Data Rest конфигурация.

5. Заключение

В этой статье мы взяли пример приложения Spring Data Rest и указали его на базу данных SQLite. Однако для этого нам пришлось создать собственный диалект гибернации.

Обязательно проверьте приложение на Github . Просто запустите с mvn spring-boot:запустите и перейдите к http://localhost:8080 .