J'ai une couche de service de scénario est transactionnelle, où je ne peux que commetter après TRandaction. Je l'ai simplifié comme ci-dessous.
begin transaction
for(loop){
getHibernateTemplate().save(object);
getHibernateTemplate().get(object_by_key); //cannot get object by object_by_key because "object" is not commit into database until entire for(loop) completed.
}
end transaction. commit();
4 Réponses :
Est-ce que GetHibernateTemplate () renvoie le même modèle à chaque fois? Ou sinon un modèle basé sur une session commune. Vous ferez peut-être mieux d'enregistrer le gabarit à une variable locale et de la réutiliser, plutôt que d'appeler GetHibernateTemplate () à chaque fois.
begin transaction
template = getHibernateTemplate();
for(loop){
template.save(object);
template.get(object_by_key); //cannot get object by object_by_key because "object" is not commit into database until entire for(loop) completed.
}
end transaction. commit();
Comment vérifier si c'est le même HibernateTemplate (). Toute méthode en hibernatetemplate (), je peux vérifier la série série de série..etc? =)
@cometta vient d'assigner et de la réutiliser au lieu d'appeler GetHibernateTemplate encore et encore.
Comme je sais que vous ne pouvez pas le faire du tout. Ça ne marche pas. Il n'est pas possible de récupérer l'objet sauvegardé dans la même transaction. Je pense que c'est parce que la session est la cache de premier niveau et l'hibernate ne peut obtenir un nouvel objet uniquement lorsque la transaction qui crée cet objet a commité. P>
getHibernateTemplate (). Flush () est la méthode pour forcer l'hibernation à écrire dans la base de données (envoi d'insertion et de mise à jour). Ceci est fait dans une transaction, il n'est donc pas visible d'autres transactions (interrogation d'un client SQL) jusqu'à la transaction. P>
Si la requête d'insertion se présente dans le journal, il a été envoyé à la base de données. Si vous souhaitez tester que l'enregistrement a été inséré correctement, vous pouvez soit faire un getHibernateTemplate (). Effacer () (qui supprimera toutes les données mises en cache), puis effectuez une getHibernateTemplate.get () (qui va interroger à partir de la DataSource) . Ou l'autre approche du test consiste à utiliser la plaque JDbctemplate (avec la même base de données) pour interroger et vérifier. p>
Si l'outil client SQL que vous utilisez vous permet de spécifier le niveau d'isolation - Démarrage de la session client SQL dans l'isolement read_ungmited - vous permettrait de voir les modifications faites avant même que la transaction ne soit commise. P>
N'est-ce pas GetHibernateTemplate (). Fonctionnement lourd (). Si nous appelons cela, la boucle intérieure n'est-elle pas effet à charger, performance de l'application?
Pourquoi avez-vous besoin d'obtenir l'objet par clé? Vous avez déjà l'objet!
Si vraiment vous avez besoin de la clé d'objet (pour l'imprimer?) Vous pouvez utiliser une nouvelle transaction pour chaque opération de sauvegarde, mettre la transaction commencer code> et commit code> dans la boucle. p>