2008-10-08 9 views
1

Nous utilisons Spring + Hibernate pour une application Web.Spring + Hibernate: comment avoir un générateur PK configurable?

Cette Webapp sera déployée sur deux sites de production indépendants. Ces deux sites de production utiliseront la Webapp pour générer et utiliser des données Person en parallèle. Ce que j'ai besoin de faire, c'est de m'assurer que les Personnes générées sur ces deux sites de production indépendants ont toutes des PK distinctes, de sorte que nous puissions fusionner les données de Personne à partir de ces deux sites à tout moment.

Une autre contrainte qui m'est imposée est que ces PK s'inscrivent dans un Long, donc je ne peux pas utiliser les UUID.

Ce que je suis en train de faire est de modifier le mappage de mise en veille prolongée en cours, qui a séquence S_PERSON comme générateur:

<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> 

en quelque chose configurable, de sorte que PERSON_ID ont ses PKs générés à partir de séquences différentes (S_PERSON_1 peut-être et S_PERSON_2) en fonction des fichiers de configuration Spring du site de déploiement.

Bien sûr,

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

ne fonctionne pas, donc je dois trouver quelque chose d'autre ... Je suppose que mon générateur doit pointer vers un haricot configurable qui indique à son tour à une séquence ou d'une autre, mais je ne peux pas comprendre comment faire cela ...

Des idées ou une solution de contournement?

Merci!

Répondre

2

Vous pouvez utiliser des séquences sur les deux systèmes de production, mais les définir différemment:

Production System

1: CREATE SEQUENCE SEQUENCE_NAME 1 COMMENCER PAR ACCROISSEMENT 2;

Système de production 2: CREATE SEQUENCE nom_séquence COMMENCER PAR 2 AUGMENTATION PAR 2;

La première séquence générera uniquement des nombres impairs, les seconds nombres pairs seulement.

+0

Oui, c'est mon option actuelle. Le problème avec cette solution est qu'elle ajoute une étape de déploiement. Ce que je voudrais vraiment faire serait d'avoir deux séquences différentes, et de configurer le mappage pour pointer sur la séquence un ou la séquence deux dans les fichiers de conf Spring existants. –

0

Vous devez essentiellement vous assurer que les valeurs des clés correspondent à des ensembles différents. Donc, en ajoutant un varchar avec un identifiant système.

Note: Je nai testé cela, mais vous devriez être en mesure de définir une séquence normale par base de données

et faire quelque chose comme

insert VALUES('Sys1' || to_char(sequence.nextval), val1, val2, val3); 
insert VALUES('Sys2' || to_char(sequence.nextval), val1, val2, val3); 
Questions connexes