Java 冬眠。如何为字段组合添加唯一索引?

Java 冬眠。如何为字段组合添加唯一索引?,java,hibernate,jpa,constraints,unique,Java,Hibernate,Jpa,Constraints,Unique,我有以下hibernate映射: @Entity public class UserPattern { @Id @GeneratedValue Integer id; @ManyToOne @JoinColumn(name = "user_id") User user; @ManyToOne @JoinColumn(name = "patern_id") Pattern pattern; ... } hibe

我有以下hibernate映射:

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

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

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

    ...
}

hibernate是否允许添加唯一索引,即
用户
模式
的组合是唯一的?

我认为它会起作用:

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

你可以看看:

5.1.8。自然身份证

尽管我们建议使用代理键作为主键,但您应该尝试为所有实体标识自然键。自然密钥是唯一且非空的属性或属性组合。它也是不变的。将自然密钥的属性映射为
@naturaid
,或将它们映射到
元素中。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;

  ...
}

我想你可以在
@列中使用
唯一的
参数
像这样:

@列(name=“user\u name”,unique=true)
字符串用户名;
它是
UniqueConstraint
的快捷方式,您可以在说明中看到:

/**
*(可选)列是否为唯一键。这是一个
*表中的
UniqueConstraint
注释的快捷方式 *级别,并且对于唯一关键点约束 *仅对应于单个列。此约束适用 *除了主键映射和 *在表级别指定的约束。 */ 布尔唯一()默认值为false;
annotation attribute Table.uniqueConstraints的值必须是some@javax.persistence.UniqueConstraint annotationEclipse(像我一样)混淆了注释中的注释,这是一个唯一的约束,如SQL:“ADD constraint UserPattern unique…”。但是像SQL这样的唯一索引呢:“在…上创建唯一索引用户模式…”?
@Entity
public class UserPattern {
  @Id
  @GeneratedValue
  Integer id;

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

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

  ...
}