Spring SQLite唯一列抛出异常



我正在使用SQLite数据库的spring引导,并且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语句,但它会违背为我管理DB的全部意义:
DROP TABLE IF EXISTS my_entities;
CREATE TABLE my_entities(
...
word varchar(255) UNIQUE,
...
);

最后,我不明白为什么SQLiteDialect不能从一开始就用唯一修饰符创建表。有没有人有办法让春天或方言做到这一点?

我假设您正在使用Hibernate与hbm2ddl.auto=update。Spring不管理您的DDL。这取决于您的JPA提供者。也与SQLiteDialect无关。

Hibernate自动DDL解析器具有以下语义(可能是为了修复一些其他错误):如果数据库已经创建,Hibernate将不包含UNIQUECREATE TABLE。相反,它将发出ALTER CONSTRAINT。自己删除数据库(对于SQLite,删除文件)。使用hbm2ddl.auto=update创建所有内容。

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

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

最新更新