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

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

例如:

@Table( name = "product_serial_group_mask", uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})} ) 

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

如前所述, @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; 

这段代码意味着maskgroup必须是唯一的,但是是分开的。 这意味着,例如,如果您有一个带有mask.id = 1的logging,并尝试插入另一个带有mask.id = 1的logging, 则会出现错误,因为该列应具有唯一值。 对于团体来说也一样。

另一方面,

 @Table( name = "product_serial_group_mask", uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})} ) 

意味着mask +组合的值应该是唯一的。 这意味着你可以有一个mask.id = 1group.id = 1的logging ,如果你尝试插入另一个loggingmask.id = 1group.id = 2 ,它将被插入成功,而在第一种情况下不会。

如果您希望将蒙版和组分别设为唯一,并且在课程级别,则必须按以下方式编写代码:

 @Table( name = "product_serial_group_mask", uniqueConstraints = { @UniqueConstraint(columnNames = "mask"), @UniqueConstraint(columnNames = "group") } ) 

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

从Java EE文档:

 public abstract boolean unique 

(可选)属性是否是唯一的密钥。 这是表级别的UniqueConstraint注释的快捷方式,适用于唯一键约束只有一个字段的情况。 除了由主键映射引起的任何约束以及在表级指定的约束之外,该约束还适用。

请参阅文档

除了波阿斯的回答….

@UniqueConstraint允许你命名约束 ,而@Column(unique = true)生成一个随机的名字(例如UK_3u5h7y36qqa13y3mauc5xxayq )。

有时,知道与某个约束关联的表是有帮助的。 例如:

 @Table( name = "product_serial_group_mask", uniqueConstraints = { @UniqueConstraint( columnNames = {"mask", "group"}, name="uk_product_serial_group_mask" ) } ) 

除了@波阿斯和@ vegemite4me的回答….

通过实现ImplicitNamingStrategy您可以创build自动命名约束的规则。 注意你在Hibernate的初始化过程中将你的命名策略添加到了metadataBuilder中:

 metadataBuilder.applyImplicitNamingStrategy(new MyImplicitNamingStrategy()); 

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

有一个错误报告来解决这个问题,所以如果可以的话,请投票在那里实施。 这里: https : //hibernate.atlassian.net/browse/HHH-11586

谢谢。