【问题标题】:hibernate. How to add unique index for field combination?冬眠。如何为字段组合添加唯一索引?
【发布时间】:2025-12-09 17:30:01
【问题描述】:

我有以下休眠映射:

@Entity
public class UserPattern {
    @Id
    @GeneratedValue
    Integer id;

    @ManyToOne
    @JoinColumn(name = "user_id")
    User user;

    @ManyToOne
    @JoinColumn(name = "patern_id")
    Pattern pattern;

    ...
}

hibernate 是否允许添加 userpattern 的组合是唯一的唯一索引?

【问题讨论】:

    标签: java hibernate jpa constraints unique


    【解决方案1】:

    我认为它会起作用:

    @Table(name="UserPattern", 
        uniqueConstraints=
            @UniqueConstraint(columnNames={"user_id", ""})
    

    @Table(name="UserPattern",  uniqueConstraints={
       @UniqueConstraint(columnNames={"user_id", "patern_id"})
    })
    

    【讨论】:

    • 注解属性Table.uniqueConstraints的值必须是@javax.persistence.UniqueConstraint注解
    • Eclipse(和我一样)混淆了注解内的注解
    • 这是一个唯一的约束——比如 SQL:“ADD CONSTRAINT UserPattern UNIQUE ...”。但是唯一索引呢 - 比如 SQL: "CREATE UNIQUE INDEX UserPattern ON ..."?
    【解决方案2】:

    你可以看看@NaturalId:

    5.1.8。自然标识

    虽然我们建议使用代理键作为主键,但您应该尝试识别所有实体的自然键。自然键是唯一且非空的属性或属性组合。它也是不可变的。将自然键的属性映射为@NaturalId 或将它们映射到<natural-id> 元素内。 Hibernate 将生成必要的唯一键和可空性约束,因此,您的映射将更加自记录。

    但是请注意,关于不变性的条款 - 这可能不适合您的用例。

    @Entity
    public class UserPattern {
      @Id
      @GeneratedValue
      Integer id;
    
      @ManyToOne
      @JoinColumn(name = "user_id")
      @NaturalId
      User user;
    
      @ManyToOne
      @JoinColumn(name = "patern_id")
      @NaturalId
      Pattern pattern;
    
      ...
    }
    

    【讨论】:

      【解决方案3】:

      我猜你可以在@Column 中使用unique 参数 像这样:

      @Column(name = "user_name", unique = true)
      String username;
      

      它是UniqueConstraint 的快捷方式,您可以在描述中看到:

          /**
           * (Optional) Whether the column is a unique key.  This is a 
           * shortcut for the <code>UniqueConstraint</code> annotation at the table 
           * level and is useful for when the unique key constraint 
           * corresponds to only a single column. This constraint applies 
           * in addition to any constraint entailed by primary key mapping and 
           * to constraints specified at the table level.
           */
          boolean unique() default false;
      

      【讨论】: