Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring SQLITE和外键支持_Spring_Sqlite_Spring Data - Fatal编程技术网

Spring SQLITE和外键支持

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

有人成功地启用了sqlite和spring,并启用了外键支持吗?默认情况下,sqlite中禁用外键支持。在的文档中提到,必须分别为每个数据库连接启用它。我确信我得到的sqlite版本支持外键(上周才下载)

测试:如果我输入PRAGMA外键;我得到了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配置启用外键?

在一个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