有人成功地让 sqlite 和 spring 在启用外键支持的情况下工作吗?默认情况下,sqlite 中禁用外键支持。 http://www.sqlite.org/foreignkeys.html 处的文档提到您必须分别为每个数据库连接启用它。我确信我得到的 sqlite 版本支持外键(上周才下载)。
测试:如果我输入 PRAGMA foreign_keys;我返回 0。这意味着外键已关闭但支持它。
我的数据源在 spring 中定义为:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverclass}"/>
<property name="url" value="${jdbc.url}"/>
</bean>
如何通过 spring 配置启用外键?
最佳答案
这是一个老问题,但最近我对同样的问题有点困惑。
我知道至少有 2 个使用 Spring Boot 的解决方案(我假设常规 Spring 有类似的解决方案)。 Sqlite 外键支持的重点是 `PRAGMA foreign_keys = ON;` 在 *per-connection basis* 上有效。 (即,如果我有两个打开的数据库连接,并且我在第一个连接中将外键支持设置为“开启”,则第一个连接将具有外键支持,但第二个连接不会。
解决方案一
来自Spring Boot reference manual :
If you use the
spring-boot-starter-jdbc
orspring-boot-starter-data-jpa
“starters”, you automatically get a dependency to HikariCP.
Spring Boot 自动创建一个 DataSource
bean 为您使用HikariCP
作为默认驱动程序。 HikariCP
本身委托(delegate)给适当的驱动程序 based on its configuration .
Spring Boot 至少期望 spring.datasource.url
设置在application.properties
. Hikari 配置设置也可以在属性文件中设置,位于 spring.datasource.hikari.<config-key>
下, 当 config-key
是 Hikari configuration keys 之一.知道这一点,使用 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 将创建并注入(inject) dataSource
bean 使用 Hikari 作为数据源,Hikari 将执行 PRAGMA foreign_keys = ON;
对于它创建的每个连接,确保始终启用外键支持。
方案二
您可以定义一个 DataSource
你的 bean @Configuration
Spring Boot 的类,并通过直接使用 Xerial JDBC driver 以编程方式设置外键支持:
@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
}
关于spring - SQLITE 和外键支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12605651/