Quel est l'avantage de persist() et save() en mode veille prolongée?
Quelqu'un peut me dire quel est l'avantage de persist()
vs save()
en veille prolongée?
- Voir aussi: quel est l'avantage de la charge() et get() en mode veille prolongée?stackoverflow.com/questions/5370482/...
Vous devez vous connecter pour publier un commentaire.
De ce post sur le forum
J'ai fait une bonne recherche sur le bouton enregistrer() vs persist (), y compris à le faire fonctionner sur ma machine locale plusieurs fois. Toutes les explications sont confuses et ne sont pas correctes. J'ai comparé la save() et persist() ci-dessous, après une recherche approfondie.
Save()
Serializable
type de retour.Persist()
generated id
à l'entité que vous êtes persistantsession.persist()
pour un décollement de l'objet va jeterPersistentObjectException
comme il n'est pas permis.Tous ces sont essayé/testé sur
Hibernate v4.0.1
.Save()
?J'ai fait de la maquette de test pour enregistrer la différence entre
save()
etpersist()
.Sonne comme ces deux méthodes se comporte de la même lorsque vous traitez avec des Transitoires de l'Entité, mais diffèrent lorsque vous traitez avec des Détaché de l'Entité.
Pour l'exemple ci-dessous, prendre EmployeeVehicle comme une Entité avec PK comme
vehicleId
qui est une valeur générée etvehicleName
comme l'une de ses propriétés.Exemple 1 : traitement Transitoire Objet
Résultat:
Note le résultat est le même lorsque vous obtenez déjà un objet persistant et l'enregistrer
Répéter les mêmes à l'aide de
persist(entity)
et le résultat sera le même avec une nouvelle Id ( dire 37 , honda ) ;Exemple 2 : gérer les Détachée de l'Objet
Résultat : Vous pourriez peut-être attendre le Véhicule avec l'id : 36 obtenu en session précédente est mis à jour avec le nom "Toyota" . Mais ce qui se passe est que, une nouvelle entité est enregistrée dans la base de données avec de nouvelles Id généré et un Nom comme "Toyota"
À l'aide de persister à persister détaché entité
Résultat:
Donc, il est toujours préférable d'utiliser Persist() plutôt que de les Enregistrer() pour enregistrer doit être soigneusement utilisés lorsqu'il s'agit Transitoire de l'objet .
Remarque importante : Dans l'exemple ci-dessus , la pharmacocinétique du véhicule entité est une valeur générée , de sorte que lors de l'utilisation de save() pour conserver un décollement de l'entité , hibernate génère un nouvel id de persister . Néanmoins, si le pk n'est pas une valeur générée que c'est le résultat dans une exception indiquant clé violé.
Cette question a quelques bonnes réponses sur les différentes méthodes de persistance dans Hibernate. Pour répondre directement à votre question, avec save() l'instruction insert est exécuté immédiatement, indépendamment de l'état de la transaction. Il renvoie à l'insertion de la clé de sorte que vous pouvez faire quelque chose comme ceci:
Donc utiliser la méthode save() si vous avez besoin d'un identifiant attribué à l'instance persistante immédiatement.
Avec persist(), l'instruction insert est exécutée dans une transaction, pas nécessairement immédiatement. C'est préférable dans la plupart des cas.
Utiliser persist() si vous n'avez pas besoin de les insérer pour produire la séquence avec la transaction et que vous n'avez pas besoin de l'insertion de la clé retourné.
save()- Comme la méthode nom l'indique, hibernate save() peut être utilisé pour économiser de l'entité de base de données. Nous pouvons appeler cette méthode en dehors d'une transaction. Si nous utilisons ce sans transaction et nous avons en cascade entre les entités, alors que l'entité principale est enregistré, à moins que nous rincer la session.
persist()-Hibernate persistent est similaire à enregistrer (avec de la transaction), et il ajoute l'objet d'entité à la persistance de contexte, de sorte que toute les autres changements sont suivis. Si les propriétés de l'objet sont modifiées avant la transaction est validée ou de la session est vidé, il sera également enregistrée dans la base de données.
Aussi, nous pouvons utiliser persist() la méthode que dans la limite d'une transaction, il est donc sûr et prend soin de tout en cascade des objets.
Enfin, persistent à ne retourne rien, donc nous avons besoin d'utiliser l'objet persistant pour obtenir l'identifiant généré de la valeur.
Voici les différences qui vous aideront à obtenir l'avantage de persister et de la méthode d'enregistrement:
le type de retour de persister méthode est vide, alors que le type de retour de sauver
la méthode est Sérialisable objet.
La persist() la méthode ne garantit pas que la valeur de l'identifiant sera
être attribué à l'état persistant immédiatement, la cession pourrait
arrive flush.
La persist() la méthode de ne pas exécuter une requête d'insertion si elle est appelée
à l'extérieur des limites des transactions. Alors, la méthode save() retourne
un identifiant ainsi qu'un insert requête est exécutée immédiatement pour obtenir
l'identificateur, peu importe si il sont à l'intérieur ou à l'extérieur d'un
des transactions.
L'persistent méthode est appelée à l'extérieur des limites des transactions, il est
utile pour les longues conversations avec une longue Session
contexte. D'autre part enregistrer méthode n'est pas bon dans une longue
conversation avec une Session élargie du contexte.
Cinquième de la différence entre enregistrer et de persister méthode de mise en veille prolongée:
persister est pris en charge par la JPA, tandis que l'enregistrement est uniquement pris en charge par
Mise en veille prolongée.
Vous pouvez voir l'intégralité de travail exemple de la poste Différence entre enregistrer et de persister méthode en veille prolongée
Voici la différence:
enregistrer:
Persistent:
En fait la différence entre hibernate save() et persist() méthodes dépend du générateur de classe que nous utilisons.
Si notre générateur de classe sera affectée, alors il n'y a pas de différence entre save() et persist() méthodes. Parce que générateur de "attribuées" signifie, en tant que programmeur, nous avons besoin de donner la clé primaire de la valeur à enregistrer dans la base de données de droit [ j'Espère que vous savez ce générateurs concept ]
Dans les cas autres que ceux affectés générateur de classe, suppose que si notre générateur de nom de la classe est Incrément de moyens hibernate, il ne restera de lui attribuer l'id de clé primaire de la valeur dans la base de données de droit [autres que assigné générateur, hibernate seulement utilisé pour prendre soin de la clé primaire id valeur rappelez-vous], dans ce cas, si nous appeler save() ou persist() méthode, puis il va insérer l'enregistrement dans la base de données normalement
Mais entendre la chose est, méthode save() peut retourner que l'id de clé primaire de la valeur qui est généré par hibernate et nous pouvons le voir par
long s = session.enregistrer(k);
Dans ce même cas, persist() ne pourra donner n'importe quelle valeur pour le client, de retour void.
persist() garantit également qu'il ne sera pas exécuter une instruction INSERT si elle est appelée à l'extérieur des limites des transactions.
où que Save() INSERT se produit immédiatement, peu importe si vous êtes à l'intérieur ou à l'extérieur d'une transaction.
Règle de base, dit que :
Pour les Entités avec l'identifiant généré :
save() : retourne une entité identifiant immédiatement en plus de faire l'objet persistant. Si une requête d'insertion est déclenché immédiatement.
persist() : Elle retourne l'objet persistant. Il n'a pas de contrainte de retourner l'identificateur immédiatement de sorte qu'il ne garantit pas que l'insert sera immédiatement licenciés. Il peut mettre le feu à un insert immédiatement, mais il n'est pas garanti. Dans certains cas, la requête peut être déclenché immédiatement, tandis que dans d'autres, il peut être déclenché lors de la session du flush.
Pour les Entités avec l'identifiant attribué :
save(): retourne une entité identifiant immédiatement. Depuis l'identifiant est déjà attribué à l'entité avant l'appel de l'enregistrer, de sorte que l'insert n'est pas immédiatement licenciés. Il est déclenché lors de la session du flush.
persist() : la même que pour enregistrer. Il a également incendie insérer le flush.
Supposons que nous avons une entité qui utilise un identifiant généré comme suit :
save() :
persist() :
Maintenant, supposons que nous avons la même entité définie comme suit, sans le champ id ayant généré annotation c'est à dire le code d'identification attribué manuellement.
pour enregistrer() :
pour persist() :
Le cas ci-dessus était vrai lors de l'enregistrer ou de persister ont été appelés dans une transaction.
Les autres points de différence entre enregistrer et persistent sont :
save() peut être appelée en dehors d'une transaction. Si l'identifiant attribué est utilisée depuis l'id est déjà disponible, donc pas de requête d'insertion est immédiatement déclenché. La requête n'est déclenché lorsque la session est vidé.
Si l'identifiant généré est utilisé , depuis id besoin d'généré, insert est immédiatement déclenché. Mais il seulement d'économiser de l'entité principale. Si l'entité a quelques cascade entités alors ceux qui ne seront pas enregistrées dans la bd à ce point. Ils seront enregistrés lorsque la session est vidé.
Si persist() est en dehors d'une transaction puis insérer est déclenché uniquement lorsque la session est vidé, quel que soit le type de l'identificateur (générées ou affectés) est utilisé.
Si économiser est appelée sur un objet persistant, l'entité est enregistré à l'aide de requête de mise à jour.
Complètement répondu sur la base de "générateur" de type ID, tandis que le stockage de n'importe quelle entité.
Si la valeur pour le générateur est "affecté", ce qui signifie que vous fournissez le numéro d'identification. Ensuite, il ne fait aucune diff en veille prolongée pour enregistrer ou persistent. Vous pouvez aller avec n'importe quelle méthode que vous voulez. Si la valeur n'est pas "affecté" et que vous utilisez save (), puis vous obtiendrez le code de retour de la save() de l'opération.
Une autre vérification est si vous effectuez l'opération à l'extérieur de la limite de crédit ou pas. Parce que persist() appartient à JPA alors que save() pour la mise en veille prolongée. Donc, en utilisant persist() à l'extérieur des limites des transactions ne permettra pas de le faire et de jeter l'exception relative aux persistant. alors qu'avec la méthode save() pas de restriction de ce type et on peut aller avec la DB de la transaction par l'intermédiaire de save() en dehors de la limite de transaction.