假设我有'主题'表
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进行检查。
它的真实用例是什么?
(我在这里假设,唯一约束也在数据库级定义。)
答案 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中的最高答案。