SQLITE和外键支持

时间:2012-09-26 15:51:39

标签: spring sqlite spring-data

任何人都有成功获得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>

如何通过弹簧配置启用外键?

4 个答案:

答案 0 :(得分:0)

在其中一个春季论坛上找到答案:

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name = "connectionInitSqls">
    <list><value>**PRAGMA foreign_keys = ON**</value></list>
    </property>
    ...
    </bean>

答案 1 :(得分:0)

这是一个古老的问题,但是最近我对相同的问题有些困惑。

我知道至少有2种使用Spring Boot的解决方案(对于常规的Spring我假设类似的解决方案)。 Sqlite外键支持的突出点是PRAGMA foreign_keys = ON;在每个连接基础上有效。 (即,如果我有两个开放的数据库连接,并且在我的第一个连接中将外键支持设置为“开”,则第一个连接将具有外键支持,而第二个连接则不会。

解决方案1 ​​
来自Spring Boot reference manual

  

如果您使用spring-boot-starter-jdbcspring-boot-starter-data-jpa   “启动器”,您会自动获得对HikariCP的依赖。

Spring Boot使用DataSource作为默认驱动程序自动为您创建一个HikariCP bean。 HikariCP本身委托给适当的驱动程序based on its configuration

Spring Boot期望至少在spring.datasource.url中设置application.properties。当spring.datasource.hikari.<config-key>Hikari configuration keys之一时,也可以在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*
        )
    }
}

Spring Boot将使用Hikari作为数据源来创建并注入dataSource bean,并且Hikari将为其创建的每个连接执行PRAGMA foreign_keys = ON;,以确保始终启用外键支持。

解决方案2
您可以在DataSource类中为Spring Boot定义一个@Configuration bean,并通过编程直接使用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
}

答案 2 :(得分:0)

直到今天,我还是使用带有SQLite和普通JdbcTemplate的Spring Boot 2.2.2遇到了同样的问题。

实施帕特里克·泰勒(Patrick Tyler)的答案的解决方案2破坏了我的测试中的所有功能。我仍然不确定为什么,因为验证外键支持已启用的非常简单的测试确实成功了。

或者,我尝试配置spring.datasource.hikari.connection-init-sql,但这也不起作用。

A,最终起作用的是将以下内容添加到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 :(得分:0)

解决方案 3

当使用 Hikari 时(默认在 spring boot 2+ 中),我们可以简单地使用 application.properties 中的以下条目配置 Xerial JDBC 驱动程序:

spring.datasource.hikari.data-source-properties.foreign_keys=true