Comment puis-je résoudre “org.mise en veille prolongée.HibernateException: createCriteria n'est pas valide sans transaction active” exception?
Je suis en utilisant Hibernate 4.0.1.Finale pour écrire une application Java autonome. Lors de l'essai de ma couche d'accès aux données, je suis l'exception suivante
org.mise en veille prolongée.HibernateException: createCriteria n'est pas valable sans
transaction active
lors de la recherche d'un objet. Je suis en train de séparer ma transaction au niveau du code à partir de ma base de données de code opérationnel. Mon test Unitaire est
@Before
public void setUpDAOTest() {
final Configuration configuration = new Configuration();
configuration.configure().setProperty("hibernate.show_sql", "false");
final ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
orgDao = new OrganizationDAOImpl(sessionFactory);
session = sessionFactory.openSession();
tx = session.beginTransaction();
} //setUp
@Test
public void testFindStateByAbbrev() {
final String abbrev = testProps.getProperty("test.state.abbrev");
final State state = orgDao.findStateByAbbrev(abbrev);
Assert.assertNotNull(state);
Assert.assertEquals(testProps.getProperty("test.state.abbrev"), state.getAbbrev());
} //testFindStateByAbbrev
et le code de l'unité de test invoque est ...
public class OrganizationDAOImpl extends AbstractDAO implements OrganizationDAO {
…
public State findStateByAbbrev(final String abbrev) {
State ret = null;
final Session session = sessionFactory.getCurrentSession();
final Criteria crit = session.createCriteria(State.class).add(Restrictions.eq("abbrev", abbrev));
final List<State> results = crit.list();
if (results != null && results.size() > 0) {
ret = results.get(0);
} //if
return ret;
}
L'exception est levée dans le DAO à la ligne,
final Criteria crit = session.createCriteria(State.class).add(Restrictions.eq("abbrev", abbrev));
Comment puis-je régler mon test JUnit (ou mon code DAO) pour éliminer cette exception et de faire mon code fonctionne correctement? Voici mon hibernate.cfg.xml
fichier ...
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/dbid</property>
<property name="hibernate.connection.username">user</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.pool_size">10</property>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<mapping class="org.myco.myproject.orgsclient.model.Organization" />
<mapping class="org.myco.myproject.orgsclient.model.State" />
</session-factory>
</hibernate-configuration>
Vous devez vous connecter pour publier un commentaire.
Vous pouvez déplacer
à l'intérieur de votre méthode DAO ou de lier la nouvelle session sur le thread en cours dans le
@Before
méthode.Vous avez spécifié que hibernate doit utiliser le
ThreadLocalSessionContext
. Cependant, il n'y a rien à se lier à une Session pour le thread courant.ThreadLocalSessionContext
fournit une statiquebind(org.hibernate.Session session)
méthode que vous pourriez utiliser, il assure quesessionFactory.getCurrentSession()
pouvez accéder à la session qui vous ont ouvert.Tout juste d'ouvrir une nouvelle session ne se lient pas au thread.