Spring SQLite 唯一列抛出异常

问题描述 投票:0回答:1

我正在使用带有 SQLite 数据库的 spring boot,并且 spring 在创建表后不断尝试更改列,但是 SQLite alter 语句仅支持重命名表等。我认为很明显 SQLiteDialect 会通过在表创建期间将列声明为唯一来支持这一点,但我想我错了。 我的实体看起来像这样:

@Entity
@Table(name = "my_entities")
public class MyEntity {
    // usual Long id and stuff

    @Column(nullable = false, unique = true)
    private String word;

    // other fields
}

这是显示异常的日志输出:

Error executing DDL "alter table my_entities add constraint UKegg5ipack6d4292p1uvwopxl6 unique (word)" via JDBC Statement

我考虑了很多选择:

  • 实际上我自己修改了 SQLiteDialect,因为它无论如何都是一种社区方言,但在深入研究之后我意识到我需要做的不仅仅是修改某个地方的字符串 😎
  • 创建某种类型的
    import.sql
    ,其中有一个 drop 和 create 语句,但它违背了让我的数据库为我管理的全部意义:
DROP TABLE IF EXISTS my_entities;
CREATE TABLE my_entities(
    ...
    word varchar(255) UNIQUE,
    ...
);

最终,我不明白为什么 SQLiteDialect 不能从一开始就使用 unique 修饰符创建表。有没有人有解决方案可以使 spring 或方言做到这一点?

java spring sqlite create-table unique-constraint
1个回答
2
投票

我想你正在使用 Hibernate 和

hbm2ddl.auto=update
。 Spring 不管理您的 DDL。这取决于您的 JPA 提供商。它也与
SQLiteDialect
无关。

Iirc Hibernate 自动 DDL 解析器具有以下语义(可能修复一些其他错误):如果数据库已经创建,Hibernate 将不会包含

CREATE TABLE
UNIQUE
。相反,它会发出
ALTER CONSTRAINT
。自己删除数据库(对于 SQLite,删除文件)。使用
hbm2ddl.auto=update
重新创建一切。

如果你没有使用生产代码,我个人不推荐 SQLite。 SQLite 有很多性能问题,这些问题对于教育和测试来说大多是不必要的,因此限制了很多用例。您可以改用功能齐全的 H2(支持像 SQLite 这样的文件备份)。它应该像更改 JDBC URL/数据源配置一样简单。

另一方面,理想情况下,您应该提供自己的 DDL(由 DBA 手写)或使用 Flyway 或 Liquibase 等数据库迁移工具进行自动化。

© www.soinside.com 2019 - 2024. All rights reserved.