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

时间:2014-07-10 10:05:18

标签: 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;

    ...
}

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

3 个答案:

答案 0 :(得分:6)

我认为它会起作用:

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

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

答案 1 :(得分:3)

您可以查看@NaturalId

  

<强> 5.1.8。天然-ID

     

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

  ...
}

答案 2 :(得分:0)

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

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