我正在使用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之类的东西的更多理由。