2010-07-22 45 views
3

我有下面的數據庫模式。休眠,分配多個列作爲主鍵

Table:items 
item_id int(11) autoincrement not null 
item_name varchar(22) not null 
version_start_date datetime not null 
version_end_date datetime 

上表的主鍵是(item_id,version_start_date)。 version_start_date和version_end_date的語義是跟蹤對錶格行的任何更改。如果項目名稱被修改,則會添加新行並更新舊行version_end_date。

我試圖在hibernate中對此進行建模,但複合鍵不允許根據模式存在生成器。我需要爲itemid生成器。我如何在休眠模型中進行建模。

我阻止我在這個步驟:(任何幫助將不勝感激。

謝謝 巴拉

-- Updated 

所以,最後我想下面的方法。我不想去自然ID,因爲我要生成的ID。相反,我想有item_version_id場也在表。

因此,新的模式將是...

Table:items 
item_version_id autoincrement not null 
item_id int(11) autoincrement not null 
item_name varchar(22) not null 
version_start_date datetime not null 
version_end_date datetime 
primary key(item_version_id) 
unique key(item_id,version_start_date) 

我在想這種方法可行。但是,我不知道如何在休眠中做到這一點。

只有ID元素可以有發生器。但在這種情況下,我有兩臺發電機。有沒有解決這個問題的方法。

謝謝
巴拉

回答

3

你需要一個定製的休眠類型與自定義ID生成相結合。我認爲沒有辦法解決這個問題。

這應該讓你開始。 Hibernate ID Generator

edit-- 我強烈建議您按照hibernate文檔中的建議使用代理鍵。如果你不這樣做,你就會冒險做出比他們需要的更困難的事情lot

您仍然可以將您的版本控制方案建模爲自然鍵並查詢。

編輯爲您update--

顯然,這是現在可能(還沒有回來的時候,當我們必須解決這個問題)

http://opensource.atlassian.com/projects/hibernate/browse/HHH-2060

您現在可以指定任何生成的組合鍵的一部分。這很漂亮。

我仍然認爲你最好的選擇是使用代理鍵來使休眠快樂,你的生活變得輕鬆,並且是一個自然的鍵來滿足你的業務需求。

+0

我以爲太多的替代品和一點困惑。你能提供一個例子嗎? – Boolean 2010-07-22 21:36:12

+0

@algorist自然鍵的例子或自定義休眠類型的例子? 自然的重要文件是在這裏 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-naturalid 它很容易。 自定義hibernate類型的例子並不那麼平凡。 – hvgotcodes 2010-07-22 21:39:24

+0

你可以看看現在的問題。 – Boolean 2010-07-22 22:43:19