spring - SQLITE 和外键支持

标签 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>

如何通过 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 or spring-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-keyHikari 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/

相关文章:

python - Django: DatabaseError: near "񐁓񐁌��...��1": 语法错误

java - 如何使用 Spring Data 将任意数据的子文档持久化到 MongoDB?

java - 无法从以下位置获取标识符

java - spring data mongodb findByIdIn

java - 如何让我的 Spring Boot 应用程序基于外部 Servlet?

angularjs - IE 在使用 NTLM 身份验证时随机发送空 POST 正文(使用 Angular 到 Spring)

java - 在线考试中的 Struts Spring 和 Hibernate 集成

java - 我需要使用 websockets 将 ESP8266 连接到本地 Java 服务器的帮助

python - 限制输入到SQLite3的字符数

node.js - 类型错误 : stream is undefined