这是一个老问题,但我最近对同样的问题有点困惑。
我知道至少有两种使用 Spring Boot 的解决方案(我假设常规 Spring 的解决方案类似)。Sqlite 外键支持的重点是 `PRAGMA foreign_keys = ON;` 在*每个连接的基础上*有效。(即,如果我有两个打开的数据库连接,并且我在第一个连接中将外键支持设置为“开”,则第一个连接将支持外键,但第二个连接不会。
解决方案 1
来自Spring Boot 参考手册:
如果你使用spring-boot-starter-jdbc
or spring-boot-starter-data-jpa
“starters”,你会自动获得对 HikariCP 的依赖。
Spring Boot 会自动DataSource
为您创建一个 bean,并将HikariCP
其用作默认驱动程序。本身根据其配置HikariCP
委托给适当的驱动程序。
Spring Boot 至少spring.datasource.url
需要在application.properties
. Hikari 配置设置也可以在属性文件中进行设置,在 下spring.datasource.hikari.<config-key>
,当config-key
是Hikari 配置键之一。知道了这一点,使用 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*
)
}
}
dataSource
Spring Boot 将使用 Hikari 作为 DataSource创建和注入bean,Hikari 将为PRAGMA foreign_keys = ON;
它创建的每个连接执行,确保始终启用外键支持。
解决方案 2
您可以在您的类中为 Spring Boot 定义一个DataSource
bean ,并通过直接使用Xerial JDBC 驱动程序@Configuration
以编程方式设置外键支持:
@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
}