Hibernate和SQLite:在创建时设置唯一约束



我正在使用Hibernate创建SQLite表。

我有一张这样的桌子

@Entity 
class Person(
@Column(unique = true, nullable = false)
val name: String,
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Int? = null,
)

我看到,在创建数据库时,稍后会通过ALTER请求添加unique约束

Hibernate: create table Person (id  integer, name varchar(255) not null, primary key (id))
Hibernate: alter table Person add constraint UK_is4vd0f6kw9sw4dxyie5cy9fa unique (name)

除了SQLite似乎不支持修改表约束的ALTER请求。

所以我的问题是:有没有一种方法可以直接指示Hibernate在创建表时设置唯一性约束?最好的方法是什么?

稍后我可以通过代码轻松地确保唯一性,但如果可以的话,我宁愿使用数据库的强大功能。

我应该补充一点,这是针对个人小型应用程序的,到目前为止,我正在为hibernate.hbm2ddl.auto使用update设置,因此Hibernate会自己生成SQL。我对其他方法持开放态度,但如果可以的话,我宁愿避免它们,以减少维护。

我会回答我自己的问题,因为它没有得到太多的吸引力:(。

SQLite确实不支持带约束的ALTER,而Hibernate(据我所知(也没有提供一种使用自定义SQL的干净方法。除此之外,不建议在生产中使用Hibernate:hbm2ddl.auto=update。

出于这些原因,我决定求助于Flyway并编写自己的SQL。好消息是,添加Flyway可以实现数据库迁移。坏消息是,它又是一个需要维护的依赖项。

我所做的:

在我的build.gradle.kts 中添加了飞行通道依赖项

implementation("org.flywaydb:flyway-core:8.4.3")

在我的代码中实例化了休眠前的flyway,指向同一个数据库:

val flyway = Flyway
.configure()
.dataSource("jdbc:sqlite:test.db", null, null).load()
flyway.migrate()

resources/V1__Create_person_and_entries_table.sql中添加了手写的SQL迁移文件

create table Person
(
id   integer primary key,
name varchar(255) not null UNIQUE
);

等等!

我在这里写了一篇博客文章,提供了更多细节和使用Flyway之类的东西的更多理由。

最新更新