Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Hibernate获取两个字段的唯一键?_Java_Hibernate_Orm_Jpa_Annotations - Fatal编程技术网

Java 如何使用Hibernate获取两个字段的唯一键?

Java 如何使用Hibernate获取两个字段的唯一键?,java,hibernate,orm,jpa,annotations,Java,Hibernate,Orm,Jpa,Annotations,我有两个实体类的字段,我不希望它们是唯一的,而是将它们用作键的复合字段,键本身必须是唯一的。例如,我有两个字段(名称和版本),这两个字段可以与其他记录相同,但它们一起必须是唯一的。使用Hibernate(带注释)实现这一点的最佳方法是什么?我将Hibernate Validator用于其他字段,但我不确定是否有方法使用它来验证两个字段一起构成一个唯一的键。我使用的是一个泛型实体类,它有一个id泛型类型,可以替换为一个复合键类,但我还没有让它很好地工作 这将在数据库上创建一个唯一的密钥: @Tab

我有两个实体类的字段,我不希望它们是唯一的,而是将它们用作键的复合字段,键本身必须是唯一的。例如,我有两个字段(名称和版本),这两个字段可以与其他记录相同,但它们一起必须是唯一的。使用Hibernate(带注释)实现这一点的最佳方法是什么?我将Hibernate Validator用于其他字段,但我不确定是否有方法使用它来验证两个字段一起构成一个唯一的键。我使用的是一个泛型实体类,它有一个id泛型类型,可以替换为一个复合键类,但我还没有让它很好地工作

这将在数据库上创建一个唯一的密钥:

@Table( name = "MYTABLE",
        uniqueConstraints = { @UniqueConstraint( columnNames = { "NAME", "VERSION" } ) } )
这将由数据库在更新或持久化时强制执行


如果您想使用Hibernate验证器强制执行此功能,则需要编写自己的自定义验证器

我们通常将这两个字段包装在一个标记为@embeddeble的内部键类中。例如:

@Entity
public class Foo {

  @EmbeddedId()
  private Key key;
  ...

  @Embeddable
  public static class Key {
    @Column(nullable=false)
    private String name;
    @Column(nullable=false)
    private int version;

    protected Key () {
      // for hibernate
    }
    public Key (String name, int version) {
      this.name = name;
      this.version = version;
    }
    ...
    // You probably want .equals and .hashcode methods
  }
}

您想在两列上设置“唯一约束”,还是在由两列组成的表上设置“主键”?我想在两列上设置唯一约束。例如,名称和版本的组合必须是唯一的。因此,我可以在表中有两条记录,分别是记录1(name=abc/version=1)和记录2(name=abc/version=2),但表中没有两条记录,分别是记录1(name=abc/version=1)和记录2(name=abc/version=1)。实体中应该写什么作为pk?。。。如果pk是name和version@yoav.str-如果PK是名称和版本,则应改为使用带有@Id/@IdClass或@EmbeddedId的复合主键/@Embeddable@mtpettyp-如果我想在违反该唯一约束的情况下显示消息?我可以使用SPRING MVC应用程序中的message.properties文件按照模式{ValidationAnnotationClass}.{modelObject}.{fieldName}执行吗?