2010-11-05 29 views
6

我有一個MySQL表來存放標記(即像堆棧溢出時使用的那些表)。它只有一個id(pk)和一個標籤列來保存標籤本身。休眠 - 被忽略的唯一列約束

我的標記實體的註釋的get方法如下所示。

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "id", unique = true, nullable = false) 
public int getId() { 
    return this.id; 
} 

@Column(name = "tag", unique = true, nullable = false) 
public String getTag() { 
    return this.tag; 
} 

我在標籤上使用了一個唯一的列約束,因爲對於給定的標籤不應該有多於一行。但是,Hibernate似乎忽略了這一點,即我可以多次保存完全相同的標記,它只是創建一個新行而不是拋出異常。

我錯過了什麼或應該工作嗎?

回答

3

UniqueConstraint的JavaDoc(上@Colunmunique=true只是一個快捷方式):

該註釋被用來指定一個唯一的約束將被包括在所產生的DDL伯或仲表。

所以它似乎並沒有強制插入時的唯一性。無論如何你都應該在數據庫中創建一個唯一的約束。

0

你錯過了,這只是一個信息。

您還應該在數據庫中的列上添加約束。

+0

謝謝你的回答。順便說一下,這不是那麼荒謬嗎?! – zakmck 2013-06-05 17:30:48

+0

不,不是。數據庫確實很快就會驗證該實體是否唯一。 ORM不能這麼快。這就是爲什麼這有道理。 – 2013-06-06 08:06:01

+1

我的意思是,我使用該註釋並不可笑,它不會在數據庫中創建對應的唯一約束?這是我最初瞭解它的行爲,雖然我做了一些實驗,並且它似乎只在我使用某些數據庫(如HSQL)時才反映模式的'unique = true',同樣的代碼會產生一個MySQL約束我切換數據庫配置。 – zakmck 2013-06-11 13:14:36