@UniqueConstraint和@Column(unique = true)在休眠注释
@UniqueConstraint和@Column(unique = true)?@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的记录,并尝试插入另一条记录,并且mask.id = 1,则会出现错误,因为该列应具有唯一值。对于团体来说也一样。
在另一方面,
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {@UniqueConstraint(columnNames = {"mask", "group"})}
)
意味着掩模+组组合的值应该是唯一的。这意味着你可以有,例如,与mask.id纪录= 1和group.id = 1,如果你尝试插入另一纪录mask.id = 1和group.id = 2,它将被成功插入,而在第一种情况下则不会。
如果你想有两个面具组是单独和,在一流水平独特的,你必须编写的代码如下:
@Table(
name = "product_serial_group_mask",
uniqueConstraints = {
@UniqueConstraint(columnNames = "mask"),
@UniqueConstraint(columnNames = "group")
}
)
这有同样的效果第一个代码块。
一旦创建了唯一约束,我可以在我的JPA存储库中通过名称引用约束来查询该问题? – jDub9 2018-01-09 18:48:10
从Java EE文档:
public abstract boolean unique
(可选)属性是否是一个独特的密钥。这是表级别的UniqueConstraint注释的快捷方式,适用于唯一键约束仅为单个字段的情况。除了主键映射和表级指定的约束之外,此约束还适用于任何约束条件 。
见doc
所以当我使用这段代码时: @Column(unique = true) @ManyToOne(可选= false,fetch = FetchType.EAGER) private ProductSerialMask mask; @Column(唯一=真) @ManyToOne(可选=假,取= FetchType.EAGER) 私人组基团; 我有两个索引但使用其他方式时我有一个索引它是两列组合吗? – 2013-03-13 10:33:33
除了波阿斯的答案....
@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
你可以自动命名的约束创建规则。注意:您Hibernate的初始化过程中您的命名策略添加到metadataBuilder
:
metadataBuilder.applyImplicitNamingStrategy(new MyImplicitNamingStrategy());
它适用于@UniqueConstraint
,而不是@Column(unique = true)
,它总是产生一个随机名称(例如UK_3u5h7y36qqa13y3mauc5xxayq)。
有一个错误报告来解决这个问题,所以如果可以的话,请投票那里有这个实施。 Here: https://hibernate.atlassian.net/browse/HHH-11586
谢谢。
注意:在Hibernate 5.4中,当我添加'unique = true'时,索引不会被scheme自动更新器添加。 '@ UniqueConstraint'使它出现。可能是一个错误。 – 2017-02-13 22:10:02