<bean id="annotatedsessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="packagesToScan" value="testonly.package.model" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.use_sql_comments">true</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.c3p0.min_size">5</prop>
<prop key="hibernate.c3p0.max_size">20</prop>
<prop key="hibernate.c3p0.timeout">1800</prop>
<prop key="hibernate.c3p0.max_statements">50</prop>
<prop key="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
</props>
</property>
<property name="dataSource">
<ref bean="dataSource" />
</property>
@Entity
@Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Table(name = "TestPOJOCATEGORY")
@NamedQueries({
@NamedQuery(name = "TestPOJOcategory.findAll", query = "SELECT h FROM TestPOJOcategory h"),
@NamedQuery(name = "TestPOJOcategory.findById", query = "SELECT h FROM TestPOJOcategory h WHERE h.id = :id"),
@NamedQuery(name = "TestPOJOcategory.findByCategoryname", query = "SELECT h FROM TestPOJOcategory h WHERE h.categoryname = :categoryname")})
public class TestPOJOcategory implements Serializable {
public List<TestPOJOcategory> getAllCategory(final String keyword, final int nFirst,
final int nPageSize,
final String sortColumnId,
final boolean bSortOrder) {
List<TestPOJOcategory> result = (List<TestPOJOcategory>) getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) {
Criteria crit = session.createCriteria(TestPOJOcategory.class, "TestPOJOcategory")
.add(Restrictions.ilike("categoryname", keyword))
.addOrder(bSortOrder ? Order.asc(sortColumnId) : Order.desc(sortColumnId))
.setFirstResult(nFirst).setMaxResults(nPageSize);
System.out.println("why still call from DB? suppose to call from cache");
return crit.list();
}
});
return result;
}
<cache name="testonly.package.model.TestPOJOcategory"
maxElementsInMemory="200"
eternal="true"
overflowToDisk="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
/>
Each time I call the dao, it will still call from DB. Why?
First of all, your System.out.println() statement will get executed every time whether or not 2nd level cache is accessed because such access takes place within list() method.
Secondly, Criteria - much like Query - does not automatically use 2nd level cache; configuration properties you've specified merely enable it to be used. You still need to explicitly mark each Query / Criteria instance as cacheable by calling setCacheable(true):
Criteria crit = ...;
crit.setCacheable(true);
return crit.list();
On a side note, since you're using HibernateTemplate you might as well use it right :-) and get rid of manual doInHibernate wrapper:
public List<TestPOJOcategory> getAllCategory(final String keyword, final int nFirst,
final int nPageSize,
final String sortColumnId,
final boolean bSortOrder) {
DetachedCriteria crit = DetachedCriteria.forClass(TestPOJOcategory.class);
crit.add(Restrictions.ilike("categoryname", keyword))
.addOrder(bSortOrder ? Order.asc(sortColumnId) : Order.desc(sortColumnId));
getHibernateTemplate().setCacheQueries(true); // works on both queries and criteria
return (List<TestPOJOcategory>) getHibernateTemplate()
.findByCriteria(crit, nFirst, nPageSize);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With