EclipseLink et la Séquence Générateur Preallocation
J'ai un problème je ne peux pas obtenir ma tête autour de. En mode veille prolongée, je n'ai aucun problème avec les éléments suivants:
@GeneratedValue( strategy = GenerationType.AUTO, generator = "email-seq-gen" )
@SequenceGenerator( name="email-seq-gen", sequenceName="EMAIL_SEQ_GEN", allocationSize=500 )
Ensuite dans mon schéma.ddl, j'ai ceci:
CREATE SEQUENCE EMAIL_SEQ_GEN START 1 INCREMENT 500;
Pas grand chose à voir ici. Tout fonctionne comme prévu. Cependant, si je passe mon fournisseur d'EclipseLink, j'obtiens cette erreur:
The sequence named [EMAIL_SEQ_GEN] is setup incorrectly. Its increment does not match its pre-allocation size.
Alors, évidemment, j'autour de google et de voir quelque chose sur EclipseLink la création d'un nombre négatif si la valeur initiale est 1 et qu'il devrait être égal à la allocationSize.
Bon, d'accord, donc, l'ajout de "initialValue=500" et de mettre à jour mes scripts DDL partir "500" corrige cela, mais maintenant, mon numérotation commence à 500 au lieu de 1. Ce qui donne? Est-ce un EclipseLink bug ou est-il quelque chose que je ne suis pas la compréhension. Je voudrais générer des séquences qui commencent à 1 et ont de répartition des tailles qui sont à l'écoute de l'entité (dans ce cas-500). Comment pourrais-je le faire avec EclipseLink?
Merci!
Une autre façon de demander à ce que....compte tenu de cette DDL:
CREATE SEQUENCE EMAIL_SEQ_GEN START 1 INCREMENT 500;
Quelle est la bonne façon d'annoter mon entité de l'utiliser avec EclipseLink?
Si je laisse EclipseLink générer mon DDL puis ceci:
@GeneratedValue( strategy = GenerationType.AUTO, generator = "email-seq-gen" )
@SequenceGenerator( name="email-seq-gen", sequenceName="EMAIL_SEQ_GEN", initialValue=1, allocationSize=500 )
Va générer cette:
CREATE SEQUENCE EMAIL_SEQ_GEN INCREMENT BY 500 START WITH 500;
Le type qui implique qu'il est IMPOSSIBLE de créer un DDL avec une "DÉMARRER AVEC 1" à l'aide EclipseLink.
Je editted le post original à ajouter à la réponse à votre question.
OriginalL'auteur robert_difalco | 2013-08-27
Vous devez vous connecter pour publier un commentaire.
Par défaut, les entités annotées avec
@SequenceGenerator
utilisation initialValue=1 et alocationSize=50.Un "séquentiel" l'id de l'entité semble être calculée par EclipseLink avec la formule suivante:
ou, dans le cas de l'utilisation de DDL:
Pour en revenir à votre cas particulier:
produit
produit
produit
Pour répondre à vos exigences, le suivant doit être utilisé:
produit
Une séquence existante peut être retiré de la base de données avec la requête SQL suivante commande:
J'espère que cela aide.
J'ai ajouté une commande qui supprime un existsing séquence.
La création de la séquence avec l'échelon 1 est faux. EclipseLink appelle la séquence qu'une seule fois par répartition-lot (dans ce cas, une fois pour chaque tranche de 500 entités sont ajoutés dans la même transaction). Par conséquent, l'incrément doit être égale à 500. Oui, les chiffres seront ignorés lors de l'une de répartition des lots est inférieure à 500, mais c'est le prix à payer pour l'efficacité grâce à moins d'invocations de la séquence. Pour voir l'erreur qui se produit, ajouter deux entités, puis terminer le programme Java, puis ajouter une autre entité. Un java.sql.SQLIntegrityConstraintViolationException va se produire en raison d'un double numéro.
OriginalL'auteur wypieprz
Votre séquence de démarrage à 500 pas de 1. Si vous commencer à 1, alors le premier nextval ne fera que vous donner 1 id au lieu de 500.
Autrement appel nextval sur la séquence après sa mise en place, de sorte qu'il devient à 501.
Est l'erreur d'un avertissement ou d'erreur? Si vous ignorez t-il encore du travail?
Oh, et c'est une erreur qui n'a pas un avertissement.
OriginalL'auteur James
J'ai pu résoudre le problème par l'ajout d'une phrase dans la génération de schéma: REDÉMARRER
Définition de l'entité
Schéma SQL initialisation
Espère que cela aide quelqu'un.
OriginalL'auteur Simon De Uvarow