2015-09-21 1 views
0

J'essaye d'implémenter une logique d'Hibernate partagée. Toutes les bases de données ont la même table appelée MyTable qui est mappée à MyClass via Hibernate POJO.Plusieurs sessions SessionFactories ensemble

public class SessionFactoryList { 
List<SessionFactory> factories; 
int minShard; 
int maxShard; 
// getters and setters here. 
} 

Dans ma mise en œuvre de Dao, j'ai une méthode getAll qui suit -

public class MyClassDao { 
@Autowired // through Spring 
private SessionFactoryList list; 

List<MyClass> getAll() { 
List<MyClass> outputList = new ArrayList<>(); 
for(SessionFactory s : list.getFactories()) { 
    Criteria c = s.getCurrentSession.createCriteria(MyClass.class); 
    outputList.addAll(c.list()); 
} 
return outputList; 
} 

Voici mon test pour la getAll mise en œuvre correspondant -

public class MyClassTest { 
@Autowired 
SessionFactoryList list; 
@Autowired 
MyClassDao myClassDao; 

@Test 
void getAllTest() { 
    Session session1 = list.getFactories.get(0).getCurrentSession(); 
    session1.beginTransaction(); 
    session1.save(new MyClass(// some parameters here)); 
    Session session2 = list.getFactories.get(1).getCurrentSession(); 
    session2.beginTransaction(); 
    session2.save(new MyClass(// some parameters here)); 

    //Set up done. 
    assert myClassDao.getAll().size() == 2 

} 
} 

J'utilise HSQL en -mémoire base de données pour les cas de test. J'ai vérifié que les connexions DB sont correctement configurées, mais l'instruction Assert échoue.

La méthode 'getAll' de MyClassDao retourne 3 lignes. L'objet MyClass inséré dans la session de SessionFactory1 est dupliqué.

Y at-il quelque chose qui me manque ici?

Répondre

0

Je l'ai trouvé. Les 2 configurations sessionFactory que j'ai utilisées pour le test ont la même URL de base de données. Par conséquent, la même base de données a été interrogée deux fois, ce qui a provoqué les doublons.