JPA: comment faire un auto incrément
- Je utiliser Eclipselink que mon fournisseur JPA, comment puis-je en faire un terrain d'incrément automatique?
N'aimeriez-vous pas être mise en œuvre indépendante?
Voulez-vous dire, définir incrément automatique sur la base de données côté, au lieu d'utiliser JPA? faire sens. Il est facile de définir l'auto-incrémentation sur le côté de la base de données
Non, je veux dire, vous avez mentionné spécifiquement Eclipselink. Mais JPA est une interface abstraite et vous êtes censé écrire contre les API JPA. Donc je me demandais pourquoi vous spécifiquement mentionné Eclipselink. Ne devriez pas cette obligation est également fonctionner lorsque vous êtes en utilisant Hibernate comme fournisseur JPA? Vous le feriez normalement comme elle.
Pouvez-vous préciser exactement à vos besoins? Voulez-vous un champ à incrémentation automatique par entité ou globale pour toutes les entités?
Désolé, si je n'étais pas clair sur ma question. Je veux juste un auto - incrément qu'à l'intérieur d'une seule entité, pas trop de toutes les entités. Bien que, ce serait une question intéressante, d'ailleurs. @BalusC: Désolé, BalusC, je pensais que Hibernate et Eclipselink sont deux choses complètement différentes. Je n'ai aucune idée, la mise en œuvre sur EclipseLink, les travaux de mise en veille prolongée. Donc, il y a une énorme différence entre les 2 fournisseurs? Désolé pour les réponses tardives, j'ai un accès limité à internet ces derniers temps.
Voulez-vous dire, définir incrément automatique sur la base de données côté, au lieu d'utiliser JPA? faire sens. Il est facile de définir l'auto-incrémentation sur le côté de la base de données
Non, je veux dire, vous avez mentionné spécifiquement Eclipselink. Mais JPA est une interface abstraite et vous êtes censé écrire contre les API JPA. Donc je me demandais pourquoi vous spécifiquement mentionné Eclipselink. Ne devriez pas cette obligation est également fonctionner lorsque vous êtes en utilisant Hibernate comme fournisseur JPA? Vous le feriez normalement comme elle.
Pouvez-vous préciser exactement à vos besoins? Voulez-vous un champ à incrémentation automatique par entité ou globale pour toutes les entités?
Désolé, si je n'étais pas clair sur ma question. Je veux juste un auto - incrément qu'à l'intérieur d'une seule entité, pas trop de toutes les entités. Bien que, ce serait une question intéressante, d'ailleurs. @BalusC: Désolé, BalusC, je pensais que Hibernate et Eclipselink sont deux choses complètement différentes. Je n'ai aucune idée, la mise en œuvre sur EclipseLink, les travaux de mise en veille prolongée. Donc, il y a une énorme différence entre les 2 fournisseurs? Désolé pour les réponses tardives, j'ai un accès limité à internet ces derniers temps.
OriginalL'auteur Thang Pham | 2010-09-30
Vous devez vous connecter pour publier un commentaire.
Oui, je le conçois, c'est ce que vous avez écrit dans votre question. Mais il peut être interprété de plusieurs façons et de répéter la même chose sans la clarification n'aide pas beaucoup 🙂
Si vous voulez incrémenter un champ par enregistrement de l'entité (par exemple un "compteur" pour
Order
avec l'id=1, un autre pourOrder
avec id=2), ce que j'ai suggéré de travail.Si vous voulez un comportement similaire à une clé primaire (c'est à dire une auto-incrémenté colonne), il ne sera pas. Et dans ce cas, la norme JPA n'offre pas une installation donnée (standard JPA permet seulement
GenereatedValue
surId
annoté champ). La seule façon que je peux penser serait d'insérer une autre entité dédiée juste pour obtenir la clé primaire.Votre exigence exacte n'est pas claire, mais je suppose que vous parlez d'un champ aléatoire, pas de la clé primaire. Dans ce cas, vous pourriez peut-être utiliser du cycle de vie des rappels méthodes:
Je suppose que cela ne va pas fonctionner. Pour les nouvelles entités ont persisté dans la DB il définit toujours leur champ de compteur à 1, pas
select max(counter) + 1 from MyEntityTbl
. Après avoir dit que l'OP est question n'est pas très clair...Vous avez raison, ce n'est pas de vous donner un
select max(counter) + 1
. Mais je ne sais pas si c'est ce que l'OP veut exactement.Pascal: je veux juste un auto-incrément de domaine pour 1 entité, et j'arrive à la fin réglage de la base de données côté, au lieu de via JPA. Cependant, je veux apprendre comment l'installer via JPA. Donc ne Pascal façon de travailler ou je dois faire ce que le Bytecode suggèrent, requête
select (max) counter + 1 from MyEntity
, pour obtenir la valeur suivante, puis définissez-la sur le domaine du design, de l'persistent?Je pense que @Bytecode commentaire était plus une observation de l'inexactitude qu'une solution. Je ne vois pas comment vous pouvez mettre en œuvre un
select max(counter) + 1 from MyEntity
dans un tel environnement.OriginalL'auteur Pascal Thivent
JPA 2.0 vous permet de définir auto_increment dans une non-id de terrain aussi longtemps que vous définir l'incrément automatique de la colonne dans votre schéma - Hibernate /EclipseLink va pas le faire pour vous:
et puis dans votre entité:
fera l'affaire.
Le
@GeneratedValue
annotation ne rien faire dans ce cas. L'auto-incrémentation des œuvres, bien sûr, mais aprèspersist
la valeur du champ n'est pas automatiquement mis à jour à partir de DB, de sorte qu'il restenull
jusqu'à ce que l'entité serarefresh
ed.OriginalL'auteur Gonzalo Garcia Lasurtegui
@Harry: malheureusement, il semble que EclipseLink ne peut pas faire de non-champs ID auto-incrémenté. Mais on dirait que OpenJPA n'ont cette fonction:
OpenJPA vous permet d'utiliser la GeneratedValue annotation sur n'importe quel champ, et pas seulement des champs identité. Avant d'utiliser l'IDENTITÉ de la stratégie de génération, cependant, lisez la Section 3.4, “ Autoassign /Identité de la Stratégie mises en garde ” dans le Guide de Référence.
OriginalL'auteur Behrang
Certains JPA impls vous permettent de définir GeneratedValue sur le champ, si c'est PK ou pas
OriginalL'auteur user383680