【问题标题】:JPA - @Column (unique=true) - What is really point of having 'unique' attribute?JPA - @Column (unique=true) - 拥有“独特”属性的真正意义是什么?
【发布时间】:2015-08-08 05:57:27
【问题描述】:

假设我有“主题”表

CREATE TABLE subject (id int PRIMARY KEY, name VARCHAR(255) **UNIQUE**)

和相关的映射对象,

@Entity
@Table(name="subject")
public class SubjectDO {
    @Id
    @Column(name="id")
    int id;

    @Column(name="name", unique=true)
    String name;
    ...
    // Getter-Setter methods
}

当我尝试保存具有重复“名称”的对象时,无论是否定义了“unique=true”,我都会遇到类似的行为(同样的异常。)很明显,除非伸出援手,否则 JPA 实现实际上无法做任何事情到数据库进行检查。

它的真正用例是什么?

(我在这里假设,唯一约束也在数据库级别定义。)

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    有一种情况,如果 varchar 字段太长,比如 utf8mb4 编码的 255 长度,那么即使 JPA 使用 unique-true 重新创建表,唯一约束也不起作用。尝试使用 @Column(length=128, unique=ture) 设置字段并再次重新创建表以验证。请参阅this question 中的最佳答案以获得更准确的解释。

    【讨论】:

      【解决方案2】:

      @Column 中的unique=true 注解只会在DDL generation 中使用,它在运行时没有任何影响。实际的唯一性检查发生在database

      【讨论】:

        【解决方案3】:

        @Column 中的unique 仅在您让 JPA 提供程序为您创建数据库时使用 - 它将在指定列上创建唯一约束。但是,如果您已经拥有数据库,或者您在创建后更改了它,那么unique 没有任何效果。

        【讨论】:

        • 谢谢!我试图在运行时找到它的相关性。我们有任何关于 DDL 特定注释的在线资源吗?我试图搜索它但没有找到它..
        • 查看JPA Specification 中的第 11.2 节,它列出了在模式生成过程中观察到的所有注释及其属性。
        • 我知道很久以前就有人问过了,但是关于unique 属性还有一点需要考虑:单元测试。即使您的生产数据库不是由 JPA 创建的,如果您的单元测试针对 H2 等内存数据库运行,则值得使用此属性,因为它会考虑此属性。这样您就可以编写一个单元测试来验证该唯一约束。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-30
        • 1970-01-01
        • 1970-01-01
        • 2021-10-04
        • 2015-12-24
        • 1970-01-01
        相关资源
        最近更新 更多