hibernate注释中的@UniqueConstraint和@Column(unique = true)

nav*_*_gh 88 java hibernate hibernate-annotations

@UniqueConstraint@Column(unique = true)有什么区别?

例如:

@Table(
   name = "product_serial_group_mask", 
   uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
Run Code Online (Sandbox Code Playgroud)

@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;

@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;
Run Code Online (Sandbox Code Playgroud)

Gla*_*oli 131

如前所述,它是一个只有一个字段@Column(unique = true)的快捷方式UniqueConstraint.

从你给出的例子来看,两者之间存在巨大差异.

@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ProductSerialMask mask;

@Column(unique = true)
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private Group group;
Run Code Online (Sandbox Code Playgroud)

此代码意味着双方maskgroup必须是唯一的,但分开.这意味着,如果,例如,你有一个创纪录的mask.id = 1,并试图插入另一个纪录mask.id = 1,你会得到一个错误,因为该列应该具有唯一值.同组适用于团体.

另一方面,

@Table(
   name = "product_serial_group_mask", 
   uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
Run Code Online (Sandbox Code Playgroud)

意味着mask + group组合的值应该是唯一的.这意味着您可以拥有例如mask.id = 1group.id = 1的记录,如果您尝试使用mask.id = 1group.id = 2插入另一条记录,则会插入成功,而在第一种情况下,它不会.

如果你想让mask和group分别独一无二,并且在类级别上,你必须编写如下代码:

@Table(
        name = "product_serial_group_mask",
        uniqueConstraints = {
                @UniqueConstraint(columnNames = "mask"),
                @UniqueConstraint(columnNames = "group")
        }
)
Run Code Online (Sandbox Code Playgroud)

这与第一个代码块具有相同的效果.


Boa*_*oaz 27

从Java EE文档:

public abstract boolean unique
Run Code Online (Sandbox Code Playgroud)

(可选)属性是否为唯一键.这是表级别的UniqueConstraint批注的快捷方式,对于唯一键约束仅为单个字段时非常有用.除了主键映射和表级指定的约束所引起的任何约束之外,此约束也适用.

文档


veg*_*4me 20

除了波阿斯的回答......

@UniqueConstraint允许您命名约束,同时@Column(unique = true)生成随机名称(例如UK_3u5h7y36qqa13y3mauc5xxayq).

有时,知道约束与哪个表相关联会很有帮助.例如:

@Table(
   name = "product_serial_group_mask", 
   uniqueConstraints = {
      @UniqueConstraint(
          columnNames = {"mask", "group"},
          name="uk_product_serial_group_mask"
      )
   }
)
Run Code Online (Sandbox Code Playgroud)


Mar*_*rcG 5

除了@Boaz和@ vegemite4me的答案...。

通过实施,ImplicitNamingStrategy您可以创建用于自动命名约束的规则。请注意,您metadataBuilder在Hibernate的初始化期间将命名策略添加到:

metadataBuilder.applyImplicitNamingStrategy(new MyImplicitNamingStrategy());
Run Code Online (Sandbox Code Playgroud)

它适用于@UniqueConstraint,但不适用于@Column(unique = true),它始终生成一个随机名称(例如UK_3u5h7y36qqa13y3mauc5xxayq)。

有一个错误报告可以解决此问题,因此,如果可以的话,请在此处进行投票以实现此问题此处:https//hibernate.atlassian.net/browse/HHH-11586

谢谢。