我正在使用Hibernate创建SQLite表。
我有一张这样的桌子
@Entity
class Person(
@Column(unique = true, nullable = false)
val name: String,
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Int? = null,
)
我看到,当创建数据库时,unique
约束将在稍后通过ALTER添加。
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 似乎不支持更改请求修改表上的约束。。
因此,我的问题是:是否有一种方法可以真正地指示Hibernate来设置表创建的唯一性约束?最好的办法是什么?
以后我可以通过代码轻松地确保唯一性,但如果可以的话,我宁愿使用数据库的功能。
我要补充的是,到目前为止,这是针对个人小型应用程序的,到目前为止,我使用的是update
设置的hibernate.hbm2ddl.auto
,因此Hibernate生成了SQL本身。我对其他方法持开放态度,但如果能减少维护,我宁愿避免它们。
发布于 2022-02-09 23:41:09
要回答我自己的问题,因为它没有多少吸引力:)。
SQLite确实不支持带约束的ALTER,而Hibernate (据我所知)没有提供一种使用自定义SQL的干净方法。最重要的是,不建议在生产中使用Hibernate: hbm2ddl.auto=update。。
出于这些原因,我决定转而使用立交桥并编写自己的SQL。好消息是添加Flyway提供了我的数据库迁移。坏消息是,这是另外一个依赖保持。
我所做的:
在我的build.gradle.kts中添加了天桥依赖项
implementation("org.flywaydb:flyway-core:8.4.3")
在我的代码中,在hibernate之前实例化了天桥,指向同一个数据库:
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
);
等等!
我在这里上写了一篇博文,上面有更多的细节和更多的使用天桥之类的东西的理由。
https://stackoverflow.com/questions/70933212
复制相似问题