2008-10-08 49 views
1

我們使用Spring + Hibernate作爲Webapp。Spring + Hibernate:如何擁有一個可配置的PK生成器?

該Webapp將部署在兩個不相關的生產站點上。這兩個生產站點將使用Webapp並行生成和使用Person數據。

我需要做的是確保在這兩個不相關的生產站點上生成的人員都具有不同的PK,以便我們可以隨時合併來自這兩個站點的Person數據。

對我施加的進一步限制是這些PK適合Long,所以我不能使用UUID。

我試圖做的是改變目前的Hibernate映射,具有序列S_PERSON作爲發電機:

<hibernate-mapping default-cascade="save-update" auto-import="false"> 
    <class name="com.some.domain.Person" abstract="true"> 
     <id name="id"> 
      <column name="PERSON_ID"/> 
      <generator class="sequence"> 
       <param name="sequence">S_PERSON</param> 
      </generator> 
     </id> 
    ... 
</hibernate-mapping> 

弄成配置,使PERSON_ID從不同的序列產生的的PK(也許S_PERSON_1S_PERSON_2),具體取決於部署站點的Spring配置文件。

當然,

  <generator class="sequence"> 
       <param name="sequence">${sequenceName}</param> 
      </generator> 

不工作,所以我必須到別的什麼事情弄清楚......我想我的發電機應指向一個可配置的bean,反過來指向一個序列或其他,但我不知道該怎麼做...

任何想法或解決方法?

謝謝!

回答

2

你可以在兩個生產系統中使用的序列,但不同的定義他們:

生產系統1: CREATE SEQUENCE SEQUENCE_NAME 1個INCREMENT開始時由2;

生產系統2: CREATE SEQUENCE sequence_name START WITH 2 INCREMENT BY 2;

第一個序列將只生成奇數,僅次於偶數。

+0

是的,這就是我目前的選擇。這個解決方案的問題是它增加了一個部署步驟。 我真的很想做的事情是創建兩個不同的序列,並將映射配置爲指向現有Spring配置文件中的序列1或序列2。 – 2008-10-09 07:43:47

0

您基本上需要確保密鑰的值落入不同的集合。所以在系統標識符前加一個varchar。

注:我還沒有測試這一點,但你應該能夠確定每個數據庫

正常序列和做類似

insert VALUES('Sys1' || to_char(sequence.nextval), val1, val2, val3); 
insert VALUES('Sys2' || to_char(sequence.nextval), val1, val2, val3); 
相關問題