त्रुटि HibernateTemplate
. के कारण है इस क्वेरी को निष्पादित करने के लिए हाइबरनेट सत्र खोलना:
List results = hibernateTemplate.find("from database.Document d where d.name = 'doc1'");
और फिर क्वेरी चलाने के तुरंत बाद सत्र को बंद कर देता है। फिर जब कुंजियों के माध्यम से लूप किया जाता है, तो जिस सत्र से नक्शा लिंक किया गया था, वह बंद हो जाता है, इसलिए डेटा को अब लोड नहीं किया जा सकता है, जिससे प्रॉक्सी LazyInitializationException
को फेंक सकता है। ।
इस अपवाद का अर्थ है कि प्रॉक्सी अब डेटा को पारदर्शी रूप से लोड नहीं कर सकता क्योंकि जिस सत्र से लिंक किया गया है वह अब बंद हो गया है।
HibernateTemplate
. के मुख्य लक्ष्यों में से एक यह जानना है कि सत्र कब खोलना और बंद करना है। यदि कोई लेन-देन चल रहा है, तो टेम्प्लेट सत्र को खुला रखेगा।
तो यहाँ कुंजी इकाई परीक्षण को TransactionTemplate
. में लपेटना है (@Transactional
. के समतुल्य टेम्पलेट ), जिसके कारण सत्र को HibernateTemplate
. द्वारा खुला रखा जाता है . चूंकि सत्र खुला रहता है, इसलिए आलसी आरंभीकरण अपवाद नहीं होते हैं।
परीक्षण को इस तरह संशोधित करने से समस्या का समाधान हो जाएगा (TransactionTemplate
के उपयोग पर ध्यान दें) ):
import database.Document;
import database.PkgItem;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.HibernateTransactionManager;
import org.springframework.orm.hibernate3.LocalSessionFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
public class HibernateMapTest {
private static final String TEST_DIALECT = "org.hibernate.dialect.HSQLDialect";
private static final String TEST_DRIVER = "org.hsqldb.jdbcDriver";
private static final String TEST_URL = "jdbc:hsqldb:mem:adportal";
private static final String TEST_USER = "sa";
private static final String TEST_PASSWORD = "";
private HibernateTemplate hibernateTemplate;
private TransactionTemplate transactionTemplate;
@Before
public void setUp() throws Exception {
hibernateTemplate = new HibernateTemplate();
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.getHibernateProperties().put("hibernate.dialect", TEST_DIALECT);
sessionFactory.getHibernateProperties().put("hibernate.connection.driver_class", TEST_DRIVER);
sessionFactory.getHibernateProperties().put("hibernate.connection.password", TEST_PASSWORD);
sessionFactory.getHibernateProperties().put("hibernate.connection.url", TEST_URL);
sessionFactory.getHibernateProperties().put("hibernate.connection.username", TEST_USER);
sessionFactory.getHibernateProperties().put("hibernate.hbm2ddl.auto", "create");
sessionFactory.getHibernateProperties().put("hibernate.show_sql", "true");
sessionFactory.getHibernateProperties().put("hibernate.jdbc.batch_size", "0");
sessionFactory.getHibernateProperties().put("hibernate.cache.use_second_level_cache", "false");
sessionFactory.setMappingDirectoryLocations(new Resource[]{new ClassPathResource("database")});
sessionFactory.afterPropertiesSet();
hibernateTemplate.setSessionFactory(sessionFactory.getObject());
transactionTemplate = new TransactionTemplate(new HibernateTransactionManager(sessionFactory.getObject()));
}
@After
public void tearDown() throws Exception {
hibernateTemplate.getSessionFactory().close();
}
@Test
public void testFetchEntityWithMap() throws Exception {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
// Store the entities and mapping
PkgItem key = new PkgItem();
key.setName("pkgitem1");
hibernateTemplate.persist(key);
Document doc2 = new Document();
doc2.setName("doc2");
hibernateTemplate.persist(doc2);
Document doc1 = new Document();
doc1.setName("doc1");
HashMap<PkgItem, Document> documentbundles = new HashMap<PkgItem, Document>();
documentbundles.put(key, doc2);
doc1.setDocumentbundles(documentbundles);
hibernateTemplate.persist(doc1);
// Now attempt a query
List results = hibernateTemplate.find("from database.Document d where d.name = 'doc1'");
Document result = (Document)results.get(0);
// Check the doc was returned
Assert.assertEquals("doc1", result.getName());
key = (PkgItem)hibernateTemplate.find("from database.PkgItem").get(0);
Set<PkgItem> bundleKeys = result.getDocumentbundles().keySet();
// Check the key is still present in the map. At this point the test fails because
// the map contains a proxy object of the key...
Assert.assertEquals(key, bundleKeys.iterator().next());
}
});
}
}
और ये परीक्षा परिणाम और परिवर्तन के बाद लॉग हैं: