Thursday, April 28, 2016

Second level Caching in hibernate and Hibernate Example 9

Second level Caching- Across multiple sessions. Even if session is closed, the object would be saved in second level cache and if called again, will be directly accessed from there only.

Types of second level cache provider in hibernate:
1)EhCacheProvider
2) OSCacheProvider

Configuration changes in hibernate.cfg.xml
    
    1.    <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>  
    2.    <property name="hibernate.cache.use_second_level_cache">true</property>  

Person.java

@Entity(name="PERSON")
@Cacheable
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
public class Person implements java.io.Serializable{

     private static final long serialVersionUID = 1L;

     private String name;
    
     @Id
     @GeneratedValue(strategy=GenerationType.AUTO)
     private long id;

     public String getName() {
           return name;
     }

     public void setName(String name) {
           this.name = name;
     }

     public long getId() {
           return id;
     }

     public void setId(long id) {
           this.id = id;
     }
}
               

hibernate.cfg.cml


<hibernate-configuration>

      <session-factory>
           
            <property name="cache.use_second_level_cache">true</property>
            <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

           
            <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
            <property name="connection.url">jdbc:oracle:thin:@172.16.7.236:20300:prtp</property>
            <property name="connection.username">MOBI_CLEANUP_TEST1</property>
            <property name="connection.password">MOBI_CLEANUP_TEST1</property>

            <!-- JDBC connection pool (use the built-in) -->
            <property name="connection.pool_size">1</property>

            <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>

            <!-- Enable Hibernate's automatic session context management, by default
                  its update -->

            <property name="hbm2ddl.auto">update</property>
            <!-- Echo all executed SQL to stdout -->
            <property name="show_sql">true</property>
            <!-- <mapping class="org.javadsalgo.dto.UserDetailsDTO"/> <mapping class="org.javadsalgo.dto.Vehicle"/>
                  <mapping class="org.javadsalgo.dto.TwoWheeler"/> <mapping class="org.javadsalgo.dto.FourWheeler"/> -->
            <mapping class="org.javadsalgo.dto.Person" />
            <!-- <mapping resource="org/javadsalgo/model/UserDetailsDTO.hbm.xml" /> -->

      </session-factory>

</hibernate-configuration>

Output:
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from PERSON person0_ where person0_.id=?


First level Caching in Hibernate and Hibernate Example 8

Caching in Hibernate

By default, hibernate provides the First level caching which means that same queries within the same session won’t hit the DB instantly.

First Level Caching - Within the same session
Second Level Caching- Withing different session also.
Third Level Caching- Within different application also.

public class HibernateTestCache {

      public static void main(String[] args) {
           
          SessionFactory sessionFactory = new                                      Configuration().configure().buildSessionFactory();
            Session session = sessionFactory.openSession();
            session.beginTransaction();
            // First level cache is by default there in Hibernate..
            // Second query is already cached and thus hibernate doesn't             hit DB
            Person person=(Person) session.get(Person.class, 1L);
            Person person3=(Person) session.get(Person.class, 1L);
            session.getTransaction().commit();
            session.close();
     
      }
}

Output:

Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from PERSON person0_ where person0_.id=?

public class HibernateTestCache {

      public static void main(String[] args) {
           
          SessionFactory sessionFactory = new                                      Configuration().configure().buildSessionFactory();
            Session session = sessionFactory.openSession();
            session.beginTransaction();
            // First level cache is by default there in Hibernate..
            // When session is closed, hibernate will hit DB again
               even for the same query.
            Person person=(Person) session.get(Person.class, 1L);
            session.getTransaction().commit();
            session.close();
           
            // New session is created ,thus person object is lost from               first level caching and hibernate will hit the DB again...
            Session session2 = sessionFactory.openSession();
            session2.beginTransaction();
            Person person4=(Person) session2.get(Person.class, 1L);
            session2.getTransaction().commit();
            session2.close();
           
      }
}

Output :
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from PERSON person0_ where person0_.id=?
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from PERSON person0_ where person0_.id=?


Wednesday, April 27, 2016

Criteria API in Hibernate and Hibernate Example 7

Criteria API in Hibernate

Till now we’ve two ways of saving and retrieving objects in hibernate
    
     1)      get(),save()
     2)      using HQL , query object

Both above approaches require knowledge of SQL , Criteria API in hibernate doesn’t require any prior knowledge of SQL

public class HibernateTestCritereiaAPI {

      public static void main(String[] args) {
           
          SessionFactory sessionFactory = new                                      Configuration().configure().buildSessionFactory();
            Session session = sessionFactory.openSession();
            session.beginTransaction();
           
           // Criteria is alike where condition in HQL/SQL
           Criteria criteria = session.createCriteria(Person.class);
           // Restrictions are where clauses and by default it acts as &
            criteria.add(Restrictions.eq("id",6L));
            List<Person> list = (List<Person>) criteria.list();
            for(Person p: list)
                  System.out.println(p.getName());
           
            session.getTransaction().commit();
            session.close();
      }
}

Output:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_ from PERSON this_ where this_.id=?

Person 6

Named Query in hibernate & Hibernate Example 6


    1)     To consolidate all the queries of an Entity class. Putting all queries as annotations
          at Entity level.
    2)     To write queries at Entity level

@NamedQuery(name, actual query)
@NamedNativeQuery(name,actual SQL query)

In NamedNativeQuery , we can actually provide SQL type query as an argument.

HibernateNamedQuery.java
public class HibernateNamedQuery {

     public static void main(String[] args) {
          
         SessionFactory sessionFactory = new                                     Configuration().configure().buildSessionFactory();
           Session session = sessionFactory.openSession();
           session.beginTransaction();
          
           Query query = session.getNamedQuery("Person.byId");
           query.setLong(0,5);
           List<Person> list = (List<Person>) query.list();
           for(Person p: list)
                System.out.println(p.getName());

           Query query1 = session.getNamedQuery("Person.byName");
           query1.setString(0,"Person 1");
           List<Person> list1 = (List<Person>) query1.list();
           for(Person p: list1)
                System.out.println(p.getName());
          
           session.getTransaction().commit();
           session.close();
     }
}

Person.java

@Entity(name="PERSON")
@NamedQuery(name="Person.byId",query="from PERSON where id=?")
@NamedNativeQuery(name="Person.byName",query="Select * from Person where Name=?",resultClass=Person.class)
public class Person implements java.io.Serializable{

      private static final long serialVersionUID = 1L;

      private String name;
     
      @Id
      @GeneratedValue(strategy=GenerationType.AUTO)
      private long id;

      public String getName() {
            return name;
      }

      public void setName(String name) {
            this.name = name;
      }

      public long getId() {
            return id;
      }

      public void setId(long id) {
            this.id = id;
      }
}

Output:

Hibernate: select person0_.id as id0_, person0_.name as name0_ from PERSON person0_ where person0_.id=?
Person 5

Hibernate: Select * from Person where Name=?
Person 1