JPA - @Column(unique = true) - 具有“独特”属性的真正意义何在?

时间:2015-05-26 13:54:00

标签: java hibernate jpa

假设我有'主题'表

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
}

当我尝试保存具有重复'name'的对象时,使用和不使用'unique = true'定义,我得到类似的行为(相同的异常。)而且很明显JPA实现除了伸出外没有真正做任何事情到DB进行检查。

它的真实用例是什么?

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

3 个答案:

答案 0 :(得分:54)

unique中的

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

答案 1 :(得分:13)

unique=true注释中的

@Column将仅在DDL generation中使用,它在运行时没有任何影响。实际的唯一性检查发生在database

答案 2 :(得分:0)

有一种情况是,如果varchar字段太长,例如utf8mb4编码为255长度,那么即使JPA重新创建具有unique-true的表,唯一约束也不起作用。尝试使用@Column(length = 128,unique = ture)设置字段,然后再次重新创建表以进行验证。有关更准确的说明,请参见this question中的最高答案。