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

此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_1 S_PERSON_2 ),具体取决于部署站点的Spring配置文件。

当然,

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

不起作用,所以我必须找出其他的东西......我想我的生成器应该指向一个可配置的bean,它反过来指向一个或另一个序列,但我无法想象如何做到这一点。 ..

任何想法或解决方法?

谢谢!

有帮助吗?

解决方案

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

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

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

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

其他提示

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

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

并执行类似

的操作
insert VALUES('Sys1' || to_char(sequence.nextval), val1, val2, val3);
insert VALUES('Sys2' || to_char(sequence.nextval), val1, val2, val3);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top