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)
此代码意味着双方mask
并group
必须是唯一的,但分开.这意味着,如果,例如,你有一个创纪录的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 = 1和group.id = 1的记录,如果您尝试使用mask.id = 1和group.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文档:
Run Code Online (Sandbox Code Playgroud)public abstract boolean unique
(可选)属性是否为唯一键.这是表级别的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)
除了@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
谢谢。
归档时间: |
|
查看次数: |
114868 次 |
最近记录: |