JPA的@UniqueConstraint注释似乎并不能保证唯一性

时间:2014-10-21 22:48:15

标签: java hibernate jpa h2 unique-constraint

我有这段代码:

@Table(uniqueConstraints = @UniqueConstraint(columnNames = {"name", "color"}))
@MappedSuperclass
public abstract class AbstractInstance extends Model {

    @NotNull
    public String name;

    public String color;

    ...
}

但由于某种原因,@UniqueConstraint没有效果 - 我成功地使用完全相同的名称和颜色放入DB多个实例(当我查询color='green' AND name='MyName'时,我得到多个结果)。难道我做错了什么?我应该为此复合唯一性约束做些什么才能生效吗?

问题的另一个证据可能是,当我查询数据库关于我的相关表的INFORMATION_SCHEMA.CONSTRAINTS时,我得到的结果似乎没有提到' name'和'颜色'独一无二:

CONSTRAINT_CATALOG | CONSTRAINT_SCHEMA | CONSTRAINT_NAME    | CONSTRAINT_TYPE | UNIQUE_INDEX_NAME | CHECK_EXPRESSION | COLUMN_LIST  | SQL  
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
play               | public            | fkcb0e606fe2f3066d | REFERENTIAL     | PRIMARY_KEY_8     | null         | CONTAINER_ID | ALTER TABLE PUBLIC.UNLABELEDINSTANCE ADD
                   |                   |                    |                 |                   |                  |              | CONSTRAINT PUBLIC.FKCB0E606FE2F3066D FOREIGN
                   |                   |                    |                 |                   |                  |              | KEY(CONTAINER_ID) INDEX
                   |                   |                    |                 |                   |                  |              | PUBLIC.FKCB0E606FE2F3066D_INDEX_C REFERENCES
                   |                   |                    |                 |                   |                  |              | PUBLIC.DATASET(ID) NOCHECK
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
play               | public            | constraint_d7      | PRIMARY KEY     | PRIMARY_KEY_C     | null             | ID           | ALTER TABLE PUBLIC.UNLABELEDINSTANCE ADD
                   |                   |                    |                 |                   |                  |              | CONSTRAINT PUBLIC.CONSTRAINT_D7 PRIMARY KEY(ID)
                   |                   |                    |                 |                   |                  |              | INDEX PUBLIC.PRIMARY_KEY_C

我正在使用:

  • Java 1.7
  • 通过maven依赖的Hibernate:org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.1.Final(我不知道如何从中推断出JPA \ Hibernate的版本)
  • Play Framework 1.2.7
  • H2数据库(Play Framework附带的数据库,用于内存数据库)

3 个答案:

答案 0 :(得分:1)

指定@UniqueConstraint的唯一效果是,如果您正在使用JPA提供程序的模式生成功能,则会向数据库模式添加唯一约束。如果没有那么它绝对没有效果。

显而易见的必然结果是,如果要在访问数据库之前捕获唯一约束违规,则需要在代码中添加验证。

你必须在某个地方有一个persistence.xml。

https://www.playframework.com/documentation/2.1.0/JavaJPA

如上所述,您需要添加以下属性

Hibernate hbm2ddl.auto possible values and what they do?

答案 1 :(得分:0)

您定义@UniqueConstaint的班级是@MappedSuperClass。但是衍生实体不会继承唯一约束。您将需要在每个派生实体上定义唯一约束或使用orm.xml文件。

有关详情,请参阅此答案:How to use @UniqueConstraint with single table inheritance (JPA)?

此外,正如您对问题的其他答案和评论中所述:由于唯一性仅由数据库强制执行,因此@UniqueConstraint仅在您使用JPA生成架构时才会发挥作用。

答案 2 :(得分:0)

如果在使用@UniqueConstraint注释之前创建了表,则可以删除表并使用@UniqueConstraint注释创建该表。在这种情况下,@ UniqueConstraint注释可以正常工作。