【问题标题】:Using unique constraint on Hibernate JPA2在 Hibernate JPA2 上使用唯一约束
【发布时间】:2011-05-31 13:47:56
【问题描述】:

如何在休眠 POJO 上实现我的独特约束?假设数据库不包含任何内容。

我在@Column() 注释中看到了唯一属性,但我无法让它工作?
如果我想将此约束应用于多个列怎么办?

【问题讨论】:

  • 它的 C@Column 而不是 c !!!

标签: java hibernate unique unique-constraint


【解决方案1】:

您可以在类中使用 @Table(uniqueConstraints = ...) 注释声明唯一约束

@Entity
@Table(uniqueConstraints=
           @UniqueConstraint(columnNames = {"surname", "name"})) 
public class SomeEntity {
    ...
}

【讨论】:

  • 我尝试使用它但是eclipse无法识别这个注解
  • 哪一个? @UniqueConstraint?那个来自 javax.persistence.UniqueConstraint
  • 你是用注解添加的吗?您使用的是哪种数据库(如果您有像 pgadmin 这样的用于 postresql 的可视化工具,请检查约束是否在表上)?您是否使用列的逻辑名称来定义约束
  • 假设 id 已经是主键,这个例子是错误的。 unique(id, name) 弱于 unique(id) 并且弱于 unique(name)。一个更好的例子可能是 unique(name, surname)。
【解决方案2】:

基本上,如果没有数据库支持,您将无法实现唯一约束。

@Column@UniqueConstraintunique 属性是模式生成工具生成相应约束的指令,它们本身不实现约束。

您可以在插入新实体之前进行某种手动检查,但在这种情况下,您应该注意并发事务可能出现的问题。

因此在数据库中应用约束是首选。

【讨论】:

  • 所以除非数据库明确添加,否则应用程序不会强制执行唯一约束?我假设 ddl 已关闭
【解决方案3】:

在 JPA2 中,可以直接在字段中添加 Unique 约束:

@Entity
@Table(name="PERSON_TABLE") 
public class Person{
  @Id
  @Column(name = "UUID")
  private String id;

  @Column(name = "SOCIALSECURITY", unique=true)
  private String socialSecurityNumber;

  @Column(name = "LOGINID", unique=true)
  private String loginId;
}

恕我直言,将唯一约束直接分配给属性比在表格开始时要好得多。

但是,如果您需要声明一个复合唯一键,那么在 @table 注释中声明它是您唯一的选择。

【讨论】:

  • 这是对单个列的唯一约束,还是对 socialSecurityNumber 和 loginId 组合的唯一约束?
  • @StephanSchielke 这将为每一列创建一个单独的唯一约束。要在多个字段上创建唯一约束,您需要使用 Hons 的方法。
猜你喜欢
  • 1970-01-01
  • 2011-04-27
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
相关资源
最近更新 更多