Spring SQLITE和外键支持
有人成功地启用了sqlite和spring,并启用了外键支持吗?默认情况下,sqlite中禁用外键支持。在的文档中提到,必须分别为每个数据库连接启用它。我确信我得到的sqlite版本支持外键(上周才下载) 测试:如果我输入PRAGMA外键;我得到了0。这意味着外键已关闭,但支持外键 我的数据源在spring中定义为:Spring SQLITE和外键支持,spring,sqlite,spring-data,Spring,Sqlite,Spring Data,有人成功地启用了sqlite和spring,并启用了外键支持吗?默认情况下,sqlite中禁用外键支持。在的文档中提到,必须分别为每个数据库连接启用它。我确信我得到的sqlite版本支持外键(上周才下载) 测试:如果我输入PRAGMA外键;我得到了0。这意味着外键已关闭,但支持外键 我的数据源在spring中定义为: <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverclass}"/>
<property name="url" value="${jdbc.url}"/>
</bean>
如何通过spring配置启用外键?在一个spring论坛上找到了答案:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name = "connectionInitSqls">
<list><value>**PRAGMA foreign_keys = ON**</value></list>
</property>
...
</bean>
**PRAGMA外键=打开**
...
这是一个老问题,但我最近对同样的问题有点困惑。
我知道至少有两种使用Spring Boot的解决方案(我假设常规Spring也有类似的解决方案)。Sqlite外键支持的突出点是“PRAGMA foreign_keys=ON;”基于*每个连接*有效。(即,如果我有两个到数据库的打开连接,并且我在第一个连接中将外键支持设置为“开”,则第一个连接将具有外键支持,但第二个连接不会
解决方案1从: 如果您使用
spring boot starter jdbc
或spring boot starter数据jpa
“初学者”,您会自动获得对HikariCP的依赖
Spring Boot使用HikariCP
作为默认驱动程序,自动为您创建一个DataSource
bean。HikariCP
本身委托给相应的驱动程序
Spring Boot至少需要在应用程序.properties
中设置Spring.datasource.url
。Hikari配置设置也可以在Spring.datasource.Hikari.
下的属性文件中设置,而配置键
就是其中一个。知道这一点,使用Spring Boot,我们可以使用以下应用程序属性
:
spring.datasource.url=jdbc:sqlite:path/to/db/database_file.db
spring.datasource.hikari.connectionInitSql=PRAGMA foreign_keys=1
下面的DAO(我使用的是JdbcTemplate
):
Spring Boot将使用Hikari作为数据源来创建和注入数据源
bean,Hikari将为其创建的每个连接执行PRAGMA-foreign\u-keys=ON;
,确保始终启用外键支持
解决方案2您可以在Spring Boot的
@配置
类中定义数据源
bean,并通过直接使用以下命令以编程方式设置外键支持:
就在今天,我在使用SpringBoot2.2.2和SQLite以及普通的
JdbcTemplate
时遇到了同样的问题
从Patrick Tyler的答案中实现解决方案2打破了我测试中的所有东西。我仍然不知道为什么,因为验证启用外键支持的非常简单的测试成功了
或者,我尝试配置spring.datasource.hikari.connection init sql
,但这也不起作用
唉,最后的工作是将以下内容添加到application.yml
:
spring:
datasource:
hikari:
data-source-properties:
foreign_keys: true
这可以通过一个简单的测试用例进行验证:
@SpringBootTest
class SqliteTests {
@Autowired
private JdbcTemplate jdbcTemplate;
@DisplayName("Check for foreign key support in the SQLite backend")
@Test
void testSqliteForEnabledForeignKeySupport() {
final var result = jdbcTemplate.queryForObject("PRAGMA foreign_keys", Integer.class);
assertEquals(1, result);
}
}
解决方案3 使用Hikari时(在spring boot 2+中默认情况下),我们只需在application.properties中使用以下条目配置Xerial JDBC驱动程序:
spring.datasource.hikari.data-source-properties.foreign_keys=true
你试过在控制台上显式地打开它吗?所以键入
PRAGMA-foreign\u-keys=on;
,然后键入PRAGMA-foreign\u-keys;
,看看是否真的有支持。它应该会播放1
@Tim我知道这很旧,但为了防止有人看到它,在控制台中键入PRAGMA-foreign\u-keys=on;
(我假设您的意思是在sqlite控制台中)不起作用,因为需要为每个单独的连接启用外键。如果我打开一个控制台,将外键设置为打开,然后打开第二个控制台,外键将在第一个控制台中启用,但在第二个控制台中不启用。
@SpringBootTest
class SqliteTests {
@Autowired
private JdbcTemplate jdbcTemplate;
@DisplayName("Check for foreign key support in the SQLite backend")
@Test
void testSqliteForEnabledForeignKeySupport() {
final var result = jdbcTemplate.queryForObject("PRAGMA foreign_keys", Integer.class);
assertEquals(1, result);
}
}
spring.datasource.hikari.data-source-properties.foreign_keys=true