【发布时间】:2014-10-21 22:48:15
【问题描述】:
我有这个代码:
@Table(uniqueConstraints = @UniqueConstraint(columnNames = {"name", "color"}))
@MappedSuperclass
public abstract class AbstractInstance extends Model {
@NotNull
public String name;
public String color;
...
}
但由于某种原因,@UniqueConstraint 无效 - 我成功地在数据库中放入了具有完全相同名称和颜色的多个实例(当我查询 color='green' AND name='MyName' 时,我得到了多个结果)。难道我做错了什么?我应该做些什么来让这个复合唯一性约束生效吗?
问题的另一个证据可能是,当我查询数据库的 INFORMATION_SCHEMA.CONSTRAINTS 关于我的相关表时,我得到的结果似乎没有提到“名称”和“颜色”是唯一的:
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 依赖项休眠:org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.1.Final(我不知道如何从中推断出 JPA\Hibernate 的版本)
- 播放框架 1.2.7
- H2 数据库(Play Framework 自带的,用于内存数据库)
【问题讨论】:
-
您是否使用 JPA 生成数据库架构?请显示模式转储。也有可能您将 Hibernate 配置为列名与您在注释中列出的不同。
-
如何生成模式转储?以及相关的 Hibernate 配置是什么?
-
在你的 persistence.xml 中是否有一个属性
? -
我的项目中似乎没有 persistence.xml。我认为 Play 框架会在内部处理所有这些事情。
-
如果你删除了你的数据库,PlayFramework 会重新创建它吗?
标签: java hibernate jpa h2 unique-constraint