Posts Tagged ‘Hibernate’

Integrating Hibernate with Struts1.x

Friday, July 2nd, 2010
We have got list of post(s) about Hibernate. Today as a next step we’ll try to intergrate with MVC framework. We’ll take the most used one which Struts1.3. For example we’ll take the same Singer Example and we’ll work with that for intergrating with struts also.Since we have the domain object generated already, we can make use of the same domain object to populate the values from DB, when we use the Hibernate.
We just take the examples of listing all the Singers from Singers table. Since we are using Struts1.x, we may need to write the action class and form class. The following code shows Form Class. Since we are going to list all the Singers, then our Form looks like the following.
		package com.techmaddy.form;

		/*
		*  Copyright 2010 - Kumarasamy
		*	kumarasamy@techmaddy.com
		*/

		import javax.servlet.http.HttpServletRequest;

		import org.apache.struts.action.ActionForm;
		import org.apache.struts.action.ActionMapping;

		import com.techmaddy.singer.Singer;

		public class SingerForm extends ActionForm {

			private static final long serialVersionUID = 1L;

			private Singer[] singer =  new Singer[0];

			public Singer[] getSinger() {
				return singer;
			}

			public void setSinger(Singer[] singer) {
				this.singer = singer;
			}

			public void reset(ActionMapping mapping, HttpServletRequest request) {
				singer =  new Singer[0];
			}

		}
	
The DAO class will make a call to DB and returns the results. This is almost very similar to the class CRUDTest.java in Simple CRUD Operation With Hibernate. Instead of my CRUDTest class, we have an DAO Class which gets the data from DB.
My DAO Class looks like the following.
			package com.techmaddy.bo;

			/*
			*  Copyright 2010 - Kumarasamy
			*	kumarasamy@techmaddy.com
			*/

			import java.util.ArrayList;
			import java.util.Iterator;
			import java.util.List;

			import org.hibernate.Session;
			import org.hibernate.Transaction;
			import org.hibernate.Query;

			import com.techmaddy.singer.HibernateSessionFactory;
			import com.techmaddy.singer.Singer;

			public class SingerManager {

				public Singer[] getAllSingers() {
					List singer = new ArrayList();
					Session session = null;
					Transaction tx = null;

					session = HibernateSessionFactory.getSession();

					tx = session.beginTransaction();
					Query qry = session.createQuery("from Singer");
					for (Iterator iterator = qry.iterate(); iterator.hasNext();) {
						singer.add(iterator.next());
					}

					return (Singer[]) singer.toArray(new Singer[0]);
				}

			}
	
The same way, based in the action performed from the screen, we can make a call to Editing and deleting the Singers.The following Images shows the result screen.
Struts-Hibernate Integration
Download
To download the War file for Singer with Struts Integration Click Here
Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

Using Hibernate’s HQL

Friday, May 28th, 2010
Hibernate uses a powerful query language called as HQL that is similar to SQL. Compared with SQL, however, HQL is fully object-oriented and understands notions like inheritance, polymorphism and association. Hibernate generates the SQL from these HQL’s and executes against the RDBMS. HQL supports Clauses, Aggregate functions and Subqueries with it’s syntax. Other advantage of using HQL is, it can give us the results as Objects. And the queries written in HQL can be executed in all the databases with out the changing it, so it makes our application most of the time independent of database flavor we choose.We’ll discuss about the clauses and the examples of Clauses.
Clauses in HQL
HQL supports five types of Clauses, they are

  • from Clause
  • where Clause
  • select Clause
  • order by Clause
  • group by Clause
We’ll look at the from clause. And for all of these operation we’ll take the Singer domain class which we have used it in our previous post Simple CRUD Operation Using Hibernate. We have two properties to a Singer which is ID and the Singer Name. We’ll take a closer look at the CRUDTest.listSinger() method, we were using the “from Clause” to select the result from Singer table. We’ll modify that slightly to use the Query to use the from clause. So i’ll be updating listerSinger() method as follows.
			public void listSinger() {
				Session session = FactoryUtil.getSessionFactory().openSession();
				Transaction transaction = null;
				try {
						transaction = session.beginTransaction();
						Query qry = session.createQuery("from Singer singer");
						for (Iterator iterator = qry.iterate(); iterator.hasNext();) {
							Singer singer = (Singer) iterator.next();
							System.out.println(singer.getSingerName());
						}
				}
				catch (HibernateException e) {
					transaction.rollback();
					e.printStackTrace();
				}
				finally {
					session.close();
				}
			}
			
Now, We’ll look at the where clause. The where clause is smilar to where clause in SQL. In HQL Where clause allows us to set the parameters, Compound Path expressions. In case of HQL, the Compound path expressions are making it more useful and easy for the developers too. Consider our Singer example and we are going to add, Event table to store his stage events.This events may have one more attribute called address of the events, which can be put into an other table called address. Now consider the situation of getting all the events performed by a singer, which of the city Bangalore. if some one is asking to get the details of all the singer’s name then i’ll be writing the following query in SQL.
			SELECT sing.singer_name FROM SINGER sing LEFT OUTER JOIN SINGER_EVENTS eve ON eve.singer_id = sing.singer_id LEFT OUTER JOIN EVENT_ADDRESS addr ON addr.event_id = eve.event_id WHERE addr.city = 'Bangalore'
		
Writing these kind of queries is not so easy always and as java developer we won’t be concentrating on writing queries. So HQL provides a easy way to address this using Compound Path Expressions. I can rewrite the above SQL as following using HQL.
		SELECT sing.singer_name FROM SINGER sing WHERE sing.eve.addr.city = 'Bangalore'
	
isn’t that looks easy for us? The other good example i can look at here is, binding the javabean properties directly to HQL’s. This is almost similar to our Prepared Statements in JDBC. Look at the following code snipet,
				Singer singer = (Singer) session.get(Singer.class, singerId);
				singer.setSingerName("Jerry");
				query = session.createQuery(" from Singer sing where sing.name=:singername ");
				query.setProperties(singer);
	
The above code is self explantory, where we set the singer name property using the setProperties() method from Query. We’ll be able to set multiple parameters to it. I suppose this will be really helpful when work with “Dependency Injection”, i.e Inject these values through Spring Config file and call these queries.
The next clause we’ll take it here is, Select Clause. HQL offers may functionalities like SQL queries, We have Aggregate functions, expressions. The most important thing i feel like discussing here is, returning the results as objects, lists and sometimes it can be ad DTO’s also. We’ll consider the above example of getting singer’s who has performed some events in “Banglore”. We’ll add some more parameters to return. We’ll add Event Name and the place of the event to return. We’ll update the CRUDTest.listSinger() to the following,
			public void listSinger() {
				Session session = FactoryUtil.getSessionFactory().openSession();
				Transaction transaction = null;
				try {
						transaction = session.beginTransaction();
						List singerDetails = session.createQuery("select new list(singer.singer_name,eve.event_name) from Singer singer where singer.eve.addr.city='Bangalore' ").list();
						for (Iterator iterator = List.iterator(); iterator.hasNext();) {
							List tempDetail = (List) iterator.next();
							System.out.println(tempDetail.get(0));
						}
				}
				catch (HibernateException e) {
					transaction.rollback();
					e.printStackTrace();
				}
				finally {
					session.close();
				}
			}
			
Basically this returns the list where we have the Singer name and event name. HQL allows us to use the “new” opertor combined with domain objects also. Say for example instead of returning as list, if we may wanted to return as domain object then the code looks like the following,
			public void listSinger() {
				Session session = FactoryUtil.getSessionFactory().openSession();
				Transaction transaction = null;
				try {
						transaction = session.beginTransaction();
						List singerDetails = session.createQuery("select new Singer(singer.singer_name,eve.event_name) from Singer singer where singer.eve.addr.city='Bangalore' ").list();
						for (Iterator iterator = List.iterator(); iterator.hasNext();) {
							Singer tempDetail = (Singer) iterator.next();
							System.out.println(tempDetail.getSingerName());
						}
				}
				catch (HibernateException e) {
					transaction.rollback();
					e.printStackTrace();
				}
				finally {
					session.close();
				}
			}
			
On the same way we use the map also to return the results from DB. For Order by clause and Group by Clause HQL will looks similar to SQL.
Warning
To execute the above code we may need to do a lot of change with the Singer.hbm.xml to accomadate the one-many relationship between Singer and the events. A best alternate could be, we can remove the join tables and return only the singer details.
Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

Simple CRUD Operation With Hibernate

Tuesday, May 25th, 2010
In my previous post Hibernate, the ORM Library for Java, we have seen the General introduction of ORM Tools and how to configure the hibernate to use it in our applications. In this post we”ll look at the simple examples of DB Operations using Hibernate.
Please have all the libraries needed to work with MySQL with Hibernate, the most important libraries are hibernate3.jar and mysqlconnector.jar.(If you are using MyEclipse, that”ll help you in adding those jars). For using the MySQL the hibernate configuration will look like the following.
		<hibernate-configuration>
			<session-factory>
				<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
				<property name="hibernate.connection.url">jdbc:mysql://localhost/Singer</property>
				<property name="hibernate.connection.username">root</property>
				<property name="connection.password">demo</property>
				<property name="connection.pool_size">1</property>
				<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
				<property name="show_sql">true</property>
				<property name="hbm2ddl.auto">create</property>
			</session-factory>
		</hibernate-configuration>
	
For domain class we”ll take the example of Singer, Who performs some stage shows. As of now we”ll add two properties for him, Which is id and the name of the singer. So we”ll have to configure the Singer.hbm.xml file for Singer as follows.
		<hibernate-mapping>
			<class name="com.techmaddy.singer" table="TBL_SINGER">
			<meta attribute="class-description">Domain Object for Singer</meta>
				<id name="singerId" type="long" column="SINGER_ID">
					<generator class="native"/>
				</id>
				<property name="singerName" type="string" column="SINGER_NAME" not-null="true" />
			</class>
		</hibernate-mapping>
	
We can make use of the MyEclipse’’s “Hibernate Reverse Engineering” option from the database perspective, so that we can easily generate the Singer.hbm.xml and Singer.java domain class also.

		package com.techmaddy.singer;

		public class Singer implements java.io.Serializable {

			private Long singerId;
			private String singerName;

			public Singer() {}

			public Singer(String singerName) {
				this.singerName = singerName;
			}

			public Long getSingerId() {
				return this.singerId;
			}

			public void setSingerId(Long singerId) {
				this.singerId = singerId;
			}

			public String getSingerName() {
				return this.singerName;
			}

			public void setSingerName(String singerName) {
				this.singerName = singerName;
			}
		}
		
This above code ss an domain class for Singer, It’’s just nothing but an POJO or we can say an JavaBean. The other important component fo Hibernate is SessionFactory. The SessionFactory provides the session to work with RDBMS. SessionFactory should be created only once per application on web container. SessionFactory can be created many ways, most of the time SessionFactory will be created as a Singleton utility class.By using the following methods, we can creating the SessionFactory, they are
  • An Utility Class with Singleton - A Singleton class with the option to create an SessionFactory and then the object can be made available to JVM.
  • From an Servlet - A servlet which is loaded on startup of the container and the service method pushes the object into an Singleton Utility class
  • Static Block - inside a static block in some sort of Utility Java class that can be used in program code to retrieve SessionFactory

We”ll implement the third option to create the SessionFactory.


		package com.techmaddy.singer

		public class FactoryUtil {

		//Static Session Factory
		private static org.hibernate.SessionFactory sessionFactory;

		private FactoryUtil() {}

		static {

			//Creates the SessionFactory based on the XML Configuration
			Configuration configs = new Configuration();
			sessionFactory = configs.configure().buildSessionFactory();
		}

		public static SessionFactory getInstance() {
			return sessionFactory;
		}

		public Session openSession() {
			return sessionFactory.openSession();
		}

		public Session getCurrentSession() {
			return sessionFactory.getCurrentSession();
		}

		public static void close() {
			if (sessionFactory != null)
				sessionFactory.close();
			sessionFactory = null;
		}
	}
The above code creates the SessionFactory, since the creation of SessionFactory is in Static block, we”ll be able control the creation of SessionFactory object. By this way we””l have the control of creating the session obejcts. The SessionFactory reads the hibernate cfg xml and then it creates the session object for our application. We are all set to go and write our class, to test the hibernate.
Basically we”ll look into the example of CRUD by making use of the Hibernate Session object.
			package com.techmaddy.singer;

			import org.hibernate.HibernateException;
			import org.hibernate.Session;
			import org.hibernate.Transaction;

			public class CRUDTest {

				public static void main(String[] args) {
					CRUDTest crudTest = new CRUDTest();
					Long singer = crudTest.insertSinger("Jason");
					singer = crudTest.insertSinger("Jerry");
					singer = crudTest.insertSinger("Chun");
				}

				public Long insertSinger(String singerName) {
					Session session = FactoryUtil.getSessionFactory().openSession();
					Transaction transaction = null;
					Long singerId = null;

					try {
						transaction = session.beginTransaction();
						Singer singer = new Singer();
						singer.setSingerName(singerName);
						singerId = (Long)session.save(singer);
						transaction.commit();
					}
					catch (HibernateException e) {
						transaction.rollback();
						e.printStackTrace();
					}
					finally {
						session.close();
					}
				return singerId;
			}
		}
When we run this following code, we”ll get the output in the console as follows,this is since we mentioned “show_sql” property in hibernate.cfg.xml to “true”.
Console
After executing this statement, we can check the database for inserted values.

Transaction

The CRUDTest is now hadnling update and delete operations, so the above class has been to changed to the following,

			package com.techmaddy.singer;

			import java.util.Iterator;
			import java.util.List;
			import org.hibernate.HibernateException;
			import org.hibernate.Session;
			import org.hibernate.Transaction;

			public class CRUDTest {

				public static void main(String[] args) {

					CRUDTest crudTest = new CRUDTest();
					Long singer = crudTest.insertSinger("William");
					singer = crudTest.insertSinger("Jerry");
					Long tempSinger = singer;
					singer = crudTest.insertSinger("Stanley");
					crudTest.listSinger();
					crudTest.updateSinger(singer,"Chun");
					crudTest.deleteSinger(tempSinger);
				}

				public Long insertSinger(String singerName) {

					Session session = HibernateSessionFactory.getSessionFactory().openSession();
					Transaction transaction = null;
					Long singerId = null;
					try {
						transaction = session.beginTransaction();
						Singer singer = new Singer();
						singer.setSingerName(singerName);
						singerId = (Long)session.save(singer);
						transaction.commit();
					}
					catch (HibernateException e) {
						transaction.rollback();
						e.printStackTrace();
					}
					finally {
						session.close();
					}
					return singerId;
				}

				public void listSinger() {
					Session session = HibernateSessionFactory.getSessionFactory().openSession();
					Transaction transaction = null;

					try {
						transaction = session.beginTransaction();
						List singers = session.createQuery("FROM Singer").list();
						for (Iterator iterator = singers.iterator(); iterator.hasNext();) {
							Singer singer = (Singer) iterator.next();
							System.out.println(singer.getSingerName());
						}
						transaction.commit();
					}
					catch (HibernateException e) {
						transaction.rollback();
						e.printStackTrace();
					}
					finally {
						session.close();
						}
					}

					public void updateSinger(Long singerId, String singerName) {
						Session session = HibernateSessionFactory.getSessionFactory().openSession();
						Transaction transaction = null;

						try {
							transaction = session.beginTransaction();
							Singer singer = (Singer) session.get(Singer.class, singerId);
							singer.setSingerName(singerName);
							session.update(singer);
							transaction.commit();
						}
						catch (HibernateException e) {
							transaction.rollback();
							e.printStackTrace();
						}
						finally {
							session.close();
						}
					}

					public void deleteSinger(Long singerId) {
						Session session = HibernateSessionFactory.getSessionFactory().openSession();
						Transaction transaction = null;
						try {
							transaction = session.beginTransaction();
							Singer singer = (Singer) session.get(Singer.class, singerId);
							session.delete(singer);
							transaction.commit();
						}
						catch (HibernateException e) {
							transaction.rollback();
							e.printStackTrace();
						}
						finally {
							session.close();
						}
					}
				}
All Transaction
Final Result
Download
To download the War file for Singer Click Here
Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
Get Adobe Flash player