Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.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_Sql Server_Hibernate - Fatal编程技术网

Java 我如何创建一个允许Hibernate注释为空值的唯一约束?

Java 我如何创建一个允许Hibernate注释为空值的唯一约束?,java,sql-server,hibernate,Java,Sql Server,Hibernate,我正在使用:Spring4、Hibernate4、SQLServer2008 通过这个问题的回答,我知道如何使用SQL Server 2008 但是,由于我在创建表的过程中没有生成任何手动SQL代码,所以可以通过实体类中的Hibernate注释在约束中生成“where子句”吗 我的DDL是使用java实体定义从头创建的,如下所示: @Entity @Table(name="Neighborhood", uniqueConstraints = {@UniqueConstraint(columnN

我正在使用:Spring4、Hibernate4、SQLServer2008

通过这个问题的回答,我知道如何使用SQL Server 2008

但是,由于我在创建表的过程中没有生成任何手动SQL代码,所以可以通过实体类中的Hibernate注释在约束中生成“where子句”吗

我的DDL是使用java实体定义从头创建的,如下所示:

@Entity
@Table(name="Neighborhood", 
uniqueConstraints = {@UniqueConstraint(columnNames = {"codecnbv","zipcode"})})
@JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY)
public class Neighborhood implements Serializable {

private String id;
private String codecnbv;
private String zipcode;

@Id 
@Column(name="id", nullable=false, unique=true, length=2)
public String getId() {
    return this.id;
}

@Column(name="codecnbv", nullable=true, length=12) //explicitly nullable
public String getCodecnbv() {
    return codecnbv;
}

@Column(name="zipcode", nullable=true, length=5) //explicitly nullable
public String getZipcode() {
    return zipcode;
}
}

但是,当我添加数据并尝试在codecnbv和/或zipcode列中输入第二个NULL记录时,我会收到一个异常,表明我违反了唯一约束

我的要求是我必须允许多个空值,当值不为空时,我应该有唯一的值,即

用于zipcode列

  • 56000--好的
  • 空——好的
  • 34089--好的
  • 空——好的
  • 34089--不允许
  • 34567--好的

  • 这不是Hibernate的问题,而是SQL Server的问题,它将
    NULL
    视为一个值,不允许第二个
    NULL
    值。邪恶,我知道

    一些链接:


    请检查实体表上实际设置了什么样的约束。运行
    show create table\u table\u name
    一个唯一的约束将允许一个空值。如果它允许您使用多个null值,那么它将不会是唯一的:)@M.Ali我认为null不会违反唯一约束。让A通过FK与B相关,关系是一对一,但不是强制性的。你的假设会阻止这样的事情发生constraints@M.Ali老论点
    null
    表示没有值,因此对其应用
    unique
    的限制没有意义。一般来说,我喜欢SQL Server,但这是一个重大错误。@M.Ali如果它被认为是一个未知值,那么它更应该被认为是一个不唯一的值。MySQL对此的处理更为正确:“唯一索引创建了一个约束,使得索引中的所有值都必须是不同的。如果您尝试添加一个具有与现有行匹配的键值的新行,则会发生错误。对于所有引擎,唯一索引允许包含NULL的列具有多个NULL值。”另一个链接:SJuan76我看到了SQLServer中关于空值的观点。我想我必须通过编程来管理这个业务逻辑。谢谢