2008-10-08 22 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); 
相关问题