1

我们将 Spring + Hibernate 用于 Web 应用程序。

此 Webapp 将部署在两个不相关的生产站点上。这两个生产站点将使用 Webapp 并行生成和使用 Person 数据。

我需要做的是确保在这两个不相关的生产站点上生成的 Persons 都有不同的 PK,以便我们可以随时合并来自这两个站点的 Person 数据。

对我施加的另一个限制是这些 PK 适合 a Long,所以我不能使用 UUID。

我想要做的是改变当前的休眠映射,它有序列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>

变成可配置的东西,以便根据部署站点的 Spring 配置文件PERSON_ID从不同的序列(可能S_PERSON_1和)生成其 PK。S_PERSON_2

当然,

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

不起作用,所以我必须弄清楚其他事情......我想我的生成器应该指向一个可配置的bean,而该bean又指向一个序列或另一个,但我不知道该怎么做......

有什么想法或解决方法吗?

谢谢!

4

2 回答 2

2

您可以在两个生产系统上使用序列,但以不同方式定义它们:

生产系统 1:CREATE SEQUENCE sequence_name START WITH 1 INCREMENT BY 2;

生产系统 2:CREATE SEQUENCE sequence_name START WITH 2 INCREMENT BY 2;

第一个序列将仅生成奇数,第二个仅生成偶数。

于 2008-10-08T16:33:28.867 回答
0

您基本上需要确保键的值属于不同的集合。因此,在 varchar 前面加上系统标识符。

注意:我没有对此进行测试,但您应该能够为每个数据库定义一个正常的序列

并做类似的事情

insert VALUES('Sys1' || to_char(sequence.nextval), val1, val2, val3);
insert VALUES('Sys2' || to_char(sequence.nextval), val1, val2, val3);
于 2008-10-08T18:01:49.670 回答