Это старый вопрос, но недавно меня немного смутила та же проблема.
Есть как минимум 2 решения, которые я знаю об использовании Spring Boot (я предполагаю аналогичные решения для обычного Spring). Важным моментом с поддержкой внешнего ключа Sqlite является то, что «PRAGMA external_keys = ON» действителен * для каждого соединения *. (т. е. если у меня есть два открытых соединения с базой данных, и я устанавливаю поддержку внешнего ключа на «Вкл.» в своем первом соединении, первое соединение будет иметь поддержку внешнего ключа, а второе соединение — нет.
Решение 1
Из справочное руководство по Spring Boot:
Если вы используете «стартеры» spring-boot-starter-jdbc
или spring-boot-starter-data-jpa
, вы автоматически получаете зависимость от HikariCP.
Spring Boot автоматически создает bean-компонент DataSource
, используя HikariCP
в качестве драйвера по умолчанию. HikariCP
сам делегирует полномочия соответствующему драйверу в зависимости от его конфигурации.
Spring Boot ожидает, что как минимум spring.datasource.url
будет установлено в application.properties
. Параметры конфигурации Hikari также можно установить в файле свойств в разделе spring.datasource.hikari.<config-key>
, когда config-key
является одним из ключи конфигурации Хикари. Зная это, используя Spring Boot, мы можем использовать следующие application.properties
:
spring.datasource.url=jdbc:sqlite:path/to/db/database_file.db
spring.datasource.hikari.connectionInitSql=PRAGMA foreign_keys=1
И следующий DAO (я использую JdbcTemplate
):
@Repository
public class MyDaoImpl implements MyDao {
private final JdbcTemplate JDBC_TEMPLATE;
@Autowired
public SimpleArticleDao(DataSource dataSource) {
this.JDBC_TEMPLATE = new JdbcTemplate(dataSource);
}
@Override
public void insertObject(MyObject object) {
JDBC_TEMPLATE.update(
*...insert object into some table*
)
}
}
Spring Boot создаст и внедрит bean-компонент dataSource
, используя Hikari в качестве источника данных, а Hikari будет выполнять PRAGMA foreign_keys = ON;
для каждого создаваемого соединения, гарантируя, что поддержка внешнего ключа всегда включена.
Решение 2
Вы можете определить bean-компонент DataSource
в своем классе @Configuration
для Spring Boot и программно установить поддержку внешнего ключа, напрямую используя Драйвер Xerial JDBC:
@Configuration
public class MyApplicationConfig {
@Bean
public DataSource dataSource() {
SQLiteDataSource ds = new SQLiteDataSource();
ds.setUrl("jdbc:sqlite:path/to/db/database_file.db");
SQLiteConfig config = ds.getConfig();
config.enforceForeignKeys(true);
ds.setConfig(config);
return ds;
}
@Bean
...other bean definitions
}
person
Patrick Tyler
schedule
10.07.2019
PRAGMA foreign_keys = ON;
, а затемPRAGMA foreign_keys;
, чтобы увидеть, действительно ли есть поддержка. Он должен отображать1
. - person Tim   schedule 26.09.2012PRAGMA foreign_keys = ON;
в консоль (я предполагаю, что вы имеете в виду в консоли sqlite) не сработает, так как внешние ключи должны быть включены для каждого человека связь. Если я открою консоль, включу внешние ключи, а затем открою вторую консоль, внешние ключи будут включены в первой консоли, но не во второй. - person Patrick Tyler   schedule 10.07.2019