2010-03-24 75 views
1

我想用Hibernate來自動增加ID,但是,我儘量避免重複。避免與自動增量鍵在休眠中的複製

class Service 
{ 
    Long id; // auto increment 
    String name; 
    String owner; 
    Boolean incremental; 


// setter and getter 
} 

我想達到的目標是,每當新的服務對象我想保存具有相同的名稱和所有者(無論數據字段的增量是相同的或不)爲現有的任何一箇中數據庫,它將是一個重複的條目。在這種情況下,我不想再向數據庫中添加其他條目。如何修改hbm.xml文件以避免此問題?

回答

1

如果您需要的id列覆蓋hashCode()equals(..),你可以把它。 您需要的是 *兩列上的數據庫級別的唯一約束。

(如果你使用hbmtoddl工具,你可能需要類似的東西:

<properties name="key" unique="true"> 
    <property name="name" .../> 
    <property name="owner" .../> 
</properties> 

這樣,您就不能插入重複數據。

,如果你不想讓你的代碼,以打破,當您嘗試插入重複,你需要

  • 查找名稱和所有者(如果你這樣做的時候,指數可能是一個好之後想法)
  • 如果您找不到該條目,請插入它
  • 您可能還想要捕獲在唯一約束衝突的情況下拋出的異常(如果兩個線程同時插入數據, )並重試選擇。
1

你有多種選擇:

  • 保存之前定義主鍵作爲composite-idnatural-id
  • ,使用查詢來發現是否存在具有相同名稱和所有者另一行,如果有 - 得到它。

無論哪種方式,你應該使用nameowner

+0

呃.. downvote是爲什麼? – Bozho 2010-03-25 03:47:41

+0

我認爲你的答案是好的......任何人都知道它爲什麼會降級? – Lily 2010-03-25 04:49:57

+0

其現在回到0我認爲它的好回答還有 – ant 2010-03-25 14:45:10

2

您可以使用註釋來執行相同操作。

在你的實體類的頂部,你寫:

@Table(uniqueConstraints = @UniqueConstraint(columnNames = { "name","owner"})) 
@Entity 
class Service 
{ 
    Long id; // auto increment 
    String name; 
    String owner; 

// setter and getter 
} 

這將告訴Hibernate的列名和所有者應該是唯一的一起。

+0

@謝爾文很好奇,謝爾文(+1) – 2010-03-25 15:02:45