2016-10-14 2 views
0

Environnement: Websphere 8.5, OpenJPA 2.0, DB2 z/OSOpenJPA générateur de séquence avec des valeurs négatives

Il y a deux tables: l'une avec les données vérifiées, et un autre avec les projets de données (table de transfert) + Voir que les informations d'affichage à la fois les tables.
Pour éviter le conflit de clé primaire, j'ai décidé que la table de transfert aurait des valeurs négatives en tant que clé primaire. Il travaillait en SQL, mais mon approche a échoué quand j'ai essayé de définir un générateur pour la table mise en scène dans le code Java

générateur de clé négatif a été défini comme ceci:

CREATE SEQUENCE X AS INTEGER START WITH -1 INCREMENT BY -1 
MINVALUE -999999 MAXVALUE 0 

Sur le côté de l'entité:

@Id 
@SequenceGenerator(name="X", sequenceName="X") 
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="X") 
@Column(name = "ID")` 

premier élément a été créée avec succès (avec la valeur -1), mais l'insertion du deuxième élément a échoué avec

LA GAMME DE VALEURS POUR LA COLONNE D'IDENTITÉ OU LA SÉQUENCE EST ÉPUISÉE. SQLCODE = -359, SQLSTATE = 23522

Pouvez-vous m'aider à définir @SequenceGenerator? Est-ce possible sous Open JPA 2.0? Peut-être que la définition de séquence était erronée (MINVALUE/MAXVALUE)

+0

En tant que solution à court terme, j'ai modifié générateur: 'START AVEC -99999 INCREMENT BY 1'. Pas très joli mais ça marche. – user2706534

+0

Doit être un bug/une fonction spécifique à DB2 z/OS - cela fonctionne comme prévu sur Linux. – mustaccio

Répondre

0

D'abord, je pense que votre option pour faire un 'START WITH -99999 INCREMENT BY 1' est la meilleure option. Je ne sais pas pourquoi tu sens que c'est "pas joli". Si vous faites ceci:

CREER SEQ_MYSEQ SEQUENCE EN ENTIER COMMENCEZ PAR -99999 AUGMENTER PAR 1 MINVALUE -999999 MAXVALUE 0

Vous êtes toujours lié entre -99999 plage et 0, non? Comme je l'expliquerai ci-dessous, je pense qu'OpenJPA et EclipseLink aiment compter. Donc je pense que tu auras plus de chance avec ça. Cela dit, permettez-moi de répondre à votre question d'ouverture. J'ai effectué un test sur OpenJPA et EclipseLink (car WebSphere utilise Ecliplselink dans WAS v9 et Liberty). Je n'arrive pas à faire fonctionner votre scénario avec EclipseLink, mais je peux le faire fonctionner avec OpenJPA (mais ce n'était pas joli). Permettez-moi de dire ce que j'ai fait: c'est le SQL que j'ai défini ma séquence avec (comme vous l'avez indiqué dans la description):

CREATE SEQUENCE SEQ_MYSEQ COMME INTEGER COMMENCER AVEC -1 INCREMENT PAR -1 MINVALUE -999999 MAXVALUE 0;

I défini mon générateur de séquence dans mon entité:

@Id @SequenceGenerator (name = "IDGENERATOR" Nom de séquence = "SEQ_MYSEQ", allocationSize = 1, initialValue = -1) @GeneratedValue (stratégie = GenerationType.SEQUENCE, generator = "IDGENERATOR") private int id;

Notez que je dis à JPA de commencer à -1, et d'utiliser une allocationSize de 1. L'état JavaDocs la valeur par défaut est 50. Un bummer (mais pas un bouchon de spectacle) avec allocationSize de 1 est que l'APP le fournisseur ira à la base de données pour chaque valeur de séquence (c.-à-d. que la mise en cache locale ne sera pas utilisée). Cependant, si cela n'est pas utilisé, il semble que OpenJPA et EclipseLink veulent compter par la taille de l'allocation. Il est codé en dur pour compter. C'est-à-dire que l'un demandera à la base de données la valeur suivante, puis comptera à partir de là par allocationSize, et non par compte à rebours.Sur OpenJPA, vous devez utiliser cette propriété:

Sinon, par défaut OpenJPA exécute un « ALTER SEQUENCE » pour s'assurer le INCREMENT BY défini dans le SequenceGenerator correspond à ce qui est dans la base de données. Si je n'ajoute pas cette propriété, je reçois la même exception concernant l'épuisement de la gamme. Quoi qu'il en soit, avec cela, tout fonctionne bien sur OpenJPA. Sur EclipseLink, je reçois cette exception:

Exception Description: La séquence nommée [SEQ_MYSEQ] est incorrectement configuration. Son incrément ne correspond pas à sa taille de pré-allocation. à org.eclipse.persistence.internal.jpa.EntityManagerImpl.persist (EntityManagerImpl.java:510) à hat.test.MySeqTest.main (MySeqTest.java:28)

Je ne l'ai pas creuser assez dans EclipseLink pour comprendre cela, mais j'ai joué un peu avec la séquence et il semble que EclipseLink n'aime pas les valeurs négatives ????

Merci,

Heath Thomann