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. Расширение диалекта
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 .