Comment vider les données en db à l'intérieur de printemps actif de la transaction?

Je veux tester la session hibernate méthode save() à l'aide de spring framework de test.
@La méthode d'essai est :

@Test
@Transactional
public void testSave() {
    User expected = createUser();
    getGenericDao().currentSession().save(expected);
    User actual = getUser(generatedId);
    assertUsersEqual(expected,actual);
}

Je veux rincer l'utilisateur dans la base de données. Je veux que mon utilisateur dans la base de données après cette méthode

getGenericDao().currentSession().save(expected);

Puis je veux aller à la base de données à l'aide de printemps de l'infrastructure de données et extraction de cette enregistrés l'utilisateur en ligne:

User actual = getUser(generatedId);

J'ai essayé d'utiliser hibernate méthode flush comme:

currentSession().setFlushMode(MANUAL);
//do saving here
currentSession().flush();

Il ne chasse pas mon utilisateur dans la base de données!
Cependant, si je ne fais pas d'utilisation de @Transactional de printemps, d'annotation et de sauver mon utilisateur dans la programmation du printemps de transaction-je obtenir ce que je veux. Malheureusement, alors l'utilisateur enregistré en db
n'est pas rollbacked comme il n'y a pas de ressort @Transactionnelle. Donc ma méthode d'essai les changements de la db et le comportement de la suite des méthodes de test.

Donc j'ai besoin de vider mon utilisateur dans la db à l'intérieur de la méthode d'essai(pas à la fin) et à la fin de la méthode d'essai de restauration de tous les changements à db.

Mise à JOUR suggestion pour préparer méthode comme suit:

@Transactional
public void doSave(User user){
    getGenericDao().currentSession().save(user);
}

Et appel doSave à l'intérieur de testSave est de ne rien faire. Je n'ai encore aucun utilisateur n'en db après l'exécution de cette méthode. Je définir un point d'arrêt et vérifier ma db à partir de la ligne de commande.

Mise à JOUR Merci beaucoup pour la réponse. Le problème est que la méthode flush() ne met pas mon utilisateur dans la base de données.J'ai essayé de l'Isolement.READ_UNCOMMITTED et il ne met pas mon utilisateur dans la base de données. Je peux réaliser ce que je veux, mais seulement si je désactive le printemps des transactions sur @méthode d'Essai et faire des économies dans la programmation de la transaction. MAIS alors @la méthode d'Essai n'est pas annulée en laissant enregistrés l'utilisateur pour la suite @méthodes d'Essai. Ici @méthode d'Essai pour économiser de l'utilisateur n'est pas aussi dangereux que @Test de la méthode pour supprimer l'utilisateur, car il n'est pas annulée. Il doit donc y printemps, prise en charge transactionnelle @Test de la méthode avec laquelle je ne peux pas de toute façon mettre mon utilisateur(ou supprimer) en db. En fait l'utilisateur est mis(ou supprimé) en db seulement après @méthode de Test se termine et de transaction pour @la méthode d'Essai est partie prenante. Si je veux sauver mon Utilisateur dans db dans le milieu de @méthode de Test et de revenir à la fin de @méthode d'Essai

Merci!

Pouvez-vous nous donner votre GenericDao classe aussi? EDIT: en fait, je crois que je vois le problème. La transaction en cours doit être engagée avant que les données sont enregistrées dans la base de données. Si vous avez besoin de deux @les méthodes Transactionnelles: l'un pour la sauver, et l'autre à la charge.
S'il vous plaît regarder si je l'ai fait correctement
De près. Je veux dire deux transactionnelle fonctions appelées par un non-fonction transactionnelle. Cela devrait fonctionner...
Si je fais mon testSave méthode non-transactionnelles, j'aurai pas de rollback après testSave méthode se termine. Ainsi l'utilisateur enregistré le restera.
Pas de Session trouvé pour le thread courant. C'est hibernate exception lors de l'appel de la méthode enregistrer de GenericDao. @Transactional sur doSave ne fonctionne pas!

OriginalL'auteur Volodymyr Levytskyi | 2013-06-23