当前位置: 首页 > 知识库问答 >
问题:

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

胡安怡
2023-03-14

@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;

共有3个答案

祁俊喆
2023-03-14

除了博阿斯的回答。。。。

@UniqueConstraint允许您命名约束,而@列(unique=true)生成一个随机名称(例如UK_3u5h7y36qqa13y3mauc5xxayq)。

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

@Table(
   name = "product_serial_group_mask", 
   uniqueConstraints = {
      @UniqueConstraint(
          columnNames = {"mask", "group"},
          name="uk_product_serial_group_mask"
      )
   }
)
彭霄
2023-03-14

从JavaEE留档:

public abstract boolean unique

(可选)属性是否是唯一键。这是UniqueConstraint批注在表级别的快捷方式,在唯一键约束只是单个字段时非常有用。除了主键映射和表级指定的约束之外,该约束也适用。

参见文档

那昊
2023-03-14

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

代码意味着掩码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")
        }
)

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

 类似资料:
  • 问题内容: @UniqueConstraint 和 @Column(unique = true)有 什么区别? 例如: 和 问题答案: 如前所述,是仅当单个字段时的快捷方式。 从您给出的示例来看,两者之间存在巨大差异。 此代码意味着和都必须是唯一的,但必须分开。这意味着,例如,如果您有一个 mask.id = 1 的记录,并尝试插入另一个 mask.id = 1的 记录, 则会 出现错误,因为该列

  • 问题内容: 我有一个带有以下注释的实体: 是否可以使UniqueConstraint大小写不敏感?我们正在使用PostgreSQL。 问题答案: 使用PostgreSQL,您确实可以执行以下操作来实现您的要求: 但是据我所知,没有办法使用注释来实现此目的。 如果您想依靠Hibernate的工具来生成模式并且仍然创建该索引,那么我唯一想到的选择就是 利用该功能。来自鹿特丹JBug和Hibernate

  • 在Hibernate Manytone和双向关系中,在childentity表中,插入了行列表,但未插入parent\u id。下面给出了我使用的代码。 } 在这种情况下,我得到的错误调用,parent_id不应该是空的DAO类。 如果我删除nullable=false,则会在数据库中插入子实体,但不存在parent\u id。

  • 问题内容: 有一个结构。我想以这种方式链接这三个实体:公司应包含ID,公司名称和部门列表,每个部门都有一个工人列表,ID和部门名称。每个工人都有名字,身份证。 我试图与一对多和多对一建立联系,但未成功。 公司 部 工人 我从开始: 它填充公司,但不填充其他表,也没有创建任何联接(映射)错误: 问题答案: 除了Glenn Lane的答案中提到的级联,您还需要了解双向关联是如何工作的。 它们有一个所有

  • 关于注释和注释,我遇到了一个有趣的问题在Spring Boot项目上,spring data jpa也在项目中。 基本上,我有软删除机制,这是为实体设置一个有效的日期(例如属性列在实体类中带有属性)。这些实体用注释类似于。这样,将设置为now和before的软删除的实体自动删除。(例如实体类) 我还有一些其他实体没有(例如实体类) 以及其他一些可用的表。如果是Jpa查询带注释的方法。我正面临着一些

  • 根据Hibernate留档,注释的解释如下: 在嵌入式id对象中,关联表示为关联实体的标识符。但您可以通过@MapsId注释将其值链接到实体中的常规关联。@MapsId值对应于包含关联实体标识符的嵌入式id对象的属性名称。在数据库中,这意味着客户。用户和客户ID。userId属性共享相同的基础列(本例中为user\u fk)。 它还说: 虽然JPA不支持Hibernate,但它允许您将关联直接放置