2014-10-21 27 views
0

我有這樣的代碼:JPA的註解@UniqueConstraint似乎並不保證唯一性

@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,我得到這樣的結果,其似乎不提「名」和「顏色」作爲唯一的:

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
  • Hibernate提供了Maven的依賴關係:org.hibernate.javax.persistence:休眠,JPA-2.0-API:1.0.1.Final(我不知道如何從中推斷出JPA \ Hibernate的版本)
  • 播放框架1.2.7
  • H2數據庫(即自帶播放框架,爲內存DB一)
+1

您是否使用JPA生成數據庫模式?請顯示架構轉儲。你也可以配置Hibernate,使列名不像你在註釋中列出的那樣。 – chrylis 2014-10-21 22:50:50

+0

如何生成架構轉儲?什麼是相關的Hibernate配置? – OferBr 2014-10-21 22:53:16

+0

在你的persistence.xml中,你有一個屬性? – Multisync 2014-10-21 23:24:17

回答

0

指定@UniqueConstraint的唯一影響是唯一約束,將被添加到數據庫模式(如果您使用JPA提供程序的模式生成功能)。如果不是,那麼它絕對沒有效果。

這樣做的明顯推論是,如果你想在碰到數據庫之前捕獲唯一的約束違規,你將需要在你的代碼中添加驗證。

你必須有一個persistence.xml的地方。

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

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

Hibernate hbm2ddl.auto possible values and what they do?

0

類你有定義的@UniqueConstaint@MappedSuperClass。但是獨特的約束不會被派生實體繼承。您將需要爲每個派生實體定義唯一約束或使用orm.xml文件。

看到這個答案更多:How to use @UniqueConstraint with single table inheritance (JPA)?

而且,在其他的答案和評論你的問題指出:因爲獨特性只能由數據庫實施中,@UniqueConstraint只有進場,如果你正在使用JPA來生成模式。