我正在使用带有 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
我考虑了很多选择:
import.sql
,其中有一个 drop 和 create 语句,但它违背了让我的数据库为我管理的全部意义:DROP TABLE IF EXISTS my_entities;
CREATE TABLE my_entities(
...
word varchar(255) UNIQUE,
...
);
最终,我不明白为什么 SQLiteDialect 不能从一开始就使用 unique 修饰符创建表。有没有人有解决方案可以使 spring 或方言做到这一点?
我想你正在使用 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 等数据库迁移工具进行自动化。