首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Hibernate和SQLite :设置创建的唯一约束

Hibernate和SQLite :设置创建的唯一约束
EN

Stack Overflow用户
提问于 2022-01-31 21:49:10
回答 1查看 288关注 0票数 1

我正在使用Hibernate创建SQLite表。

我有一张这样的桌子

代码语言:javascript
运行
复制
@Entity 
class Person(

    @Column(unique = true, nullable = false)
    val name: String,

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: Int? = null,
)

我看到,当创建数据库时,unique约束将在稍后通过ALTER添加。

代码语言:javascript
运行
复制
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本身。我对其他方法持开放态度,但如果能减少维护,我宁愿避免它们。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-09 23:41:09

要回答我自己的问题,因为它没有多少吸引力:)。

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

出于这些原因,我决定转而使用立交桥并编写自己的SQL。好消息是添加Flyway提供了我的数据库迁移。坏消息是,这是另外一个依赖保持。

我所做的:

在我的build.gradle.kts中添加了天桥依赖项

代码语言:javascript
运行
复制
    implementation("org.flywaydb:flyway-core:8.4.3")

在我的代码中,在hibernate之前实例化了天桥,指向同一个数据库:

代码语言:javascript
运行
复制
    val flyway = Flyway
        .configure()
        .dataSource("jdbc:sqlite:test.db", null, null).load()
    flyway.migrate()

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

代码语言:javascript
运行
复制
create table Person
(
    id   integer primary key,
    name varchar(255) not null UNIQUE
);

等等!

我在这里上写了一篇博文,上面有更多的细节和更多的使用天桥之类的东西的理由。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70933212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档