@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;
这段代码意味着mask
和group
必须是唯一的,但是是分开的。 这意味着,例如,如果您有一个带有mask.id = 1的logging,并尝试插入另一个带有mask.id = 1的logging, 则会出现错误,因为该列应具有唯一值。 对于团体来说也一样。
另一方面,
@Table( name = "product_serial_group_mask", uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})} )
意味着mask +组合的值应该是唯一的。 这意味着你可以有一个mask.id = 1和group.id = 1的logging ,如果你尝试插入另一个loggingmask.id = 1和group.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
谢谢。