我有这段代码:
@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
我正在使用:
答案 0 :(得分:1)
指定@UniqueConstraint的唯一效果是,如果您正在使用JPA提供程序的模式生成功能,则会向数据库模式添加唯一约束。如果没有那么它绝对没有效果。
显而易见的必然结果是,如果要在访问数据库之前捕获唯一约束违规,则需要在代码中添加验证。
你必须在某个地方有一个persistence.xml。
https://www.playframework.com/documentation/2.1.0/JavaJPA
如上所述,您需要添加以下属性
答案 1 :(得分:0)
您定义@UniqueConstaint
的班级是@MappedSuperClass
。但是衍生实体不会继承唯一约束。您将需要在每个派生实体上定义唯一约束或使用orm.xml文件。
有关详情,请参阅此答案:How to use @UniqueConstraint with single table inheritance (JPA)?
此外,正如您对问题的其他答案和评论中所述:由于唯一性仅由数据库强制执行,因此@UniqueConstraint
仅在您使用JPA生成架构时才会发挥作用。
答案 2 :(得分:0)
如果在使用@UniqueConstraint注释之前创建了表,则可以删除表并使用@UniqueConstraint注释创建该表。在这种情况下,@ UniqueConstraint注释可以正常工作。