Quand la JPA définir un @GeneratedValue @Id
J'ai un simple JPA entité qui utilise un générés long
"ID" comme clé primaire:
@Entity
public class Player {
private long id;
protected Player() {
//Do nothing; id defaults to 0L
}
@GeneratedValue
@Id
public long getId() {
return id;
}
protected void setId(final long id) {
this.id = id;
}
//Other code
}
À un certain moment dans le cycle de vie d'un objet de ce type, le PCA doit appeler setId()
pour enregistrer l'IDENTIFIANT généré de la valeur. Ma question est, quand est-ce possible, et où est la documentation que les membres de cette. J'ai regardé à travers la Spécification JPA et ne peut pas trouver un énoncé clair.
La Spécification JPA dit (italiques ajoutés):
Une entité gérée instance est une instance avec une persistante identité qui est actuellement associée à un contexte de persistance.
Est que d'essayer de dire que l'objet doit être géré avoir son @Id
importante?
La documentation pour EntityManager.persist()
dit (emphase ajoutée), il fait "une instance géré et persistante", cela veut-il dire que le @Id
est défini par cette méthode? Ou n'est-il pas jusqu'à ce que vous appelez EntityTransaction.commit()
?
Lorsque le @Id
est défini peut être différente pour différents JPA fournisseurs, et peut-être pour les différentes stratégies de génération. Mais ce qui est le plus sûr (portable, spécification conforme) hypothèse que vous pouvez faire sur le premier point dans le cycle de vie qu'elle a été définie?
- Sonne comme quelque chose que vous pourrait s'établir assez facilement avec le débogage.
- Je serais prêt à parier que si spec n'est pas explicitement dire lorsque le @code doit être généré que c'est à gauche pour les vendeurs de décider.
- Débogage vais vous dire comment APP fonctionne en interne, et vous dire les bits sont dialecte spécifique.
- Liées, mais pas en double, question: stackoverflow.com/questions/8169640/...
Vous devez vous connecter pour publier un commentaire.
appel .persist() ne sera pas automatiquement réglée à la valeur de l'id. Votre fournisseur JPA permettra de s'assurer qu'il est réglé avant que l'entité n'est finalement écrit db. Donc, vous êtes en droit de supposer que l'id sera attribuée lorsque la transaction est validée. Mais ce n'est pas le seul cas possible. Lorsque vous appelez .flush() le même qui va arriver.
Thomas
Mise à jour: attention à Geek commentaire, s'il vous plaît. -> Si GenerationType.L'identité est utilisé, l'id ne seront pas fixés par le fournisseur avant que l'entité n'est écrit db. Dans ce cas de génération d'identifiant qui se passe lors de l'insertion du processus sur le niveau de db. De toute façon, la JPA fournisseur veillera à ce que l'entité est mise à jour par la suite et l'id généré sera disponible dans le @Id annoté de la propriété.
EntityManager.flush()
pouvez-vous compter sur le@Generated
@Id
avoir été réglée? Je ne trouve pas d'indices dans la documentation.flush
méthode peut être utilisée par l'application pour forcer la synchronisation".strategy=GenerationType.IDENTITY
, alors il est effectivement disponible uniquement après que l'entité est écrit à la db, pas avant qu'il est écrit dans la db.Autant que je sache, l'ID n'est garanti que pour être attribué que si le contexte de persistance est vidé. Il peut être attribué plus tôt, mais cela dépend de la stratégie de génération.
Le livre de l'Entreprise Ejb 3.1 par Rubinger et Burke dit ce qui suit, à la page 143 (italiques ajoutés):
La Spécification JPA dit (italiques ajoutés):
Et aussi que
EntityManager.persist()
faitComme le
@Id
est cruciale pour la identité d'une entité, la seule façon pourEntityManager.persist()
pour faire de l'objet géré est d'établir son identité par la génération de la@Id
.Cependant
Rubinger et Buke de déclaration claire est incompatible avec le comportement de mise en veille prolongée. Il semble donc que les personnes qui connaissent disgree sur ce que la spécification JPA entend.
Selon JSR 338: JavaTM Persistance 2.1 /3.5.3 la Sémantique du Cycle de Vie des Méthodes de Rappel pour les Entités,
Un possible (personnellement présumable) exception est
GeneratorType.La TABLE
lequel le conteneur (mai) récupère les valeurs à utiliser, et (mai) devantPrePersist
. J'utilise toujours monid
dansPrePersist
. Je ne suis pas sûr que cela comportements est spécifié ou peut ne pas fonctionner avec d'autres fournisseurs.important de modifier
Pas tous les serveurs d'application id de jeu avant de
PrePersist
. Vous pouvez suivre JPA_SPEC.