hibernate. hibernate is a powerful, high performance object/relational persistence and query...

68
Hibernate

Post on 22-Dec-2015

250 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Hibernate

Page 2: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Hibernate

• Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following object-oriented idiom - including association, inheritance, polymorphism, composition, and collections. Hibernate allows you to express queries in its own portable SQL extension (HQL), as well as in native SQL, or with an object-oriented Criteria and Example API.

• Unlike many other persistence solutions, Hibernate does not hide the power of SQL from you and guarantees that your investment in relational technology and knowledge is as valid as always. The LGPL open source license allows the use of Hibernate and NHibernate in open source and commercial projects.

Page 3: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Java Persistence with Hibernate

• The Java Persistence API is the standard object/relational mapping and persistence management interface of the Java EE 5.0 platform. As part of the EJB 3.0 specification effort, it is supported by all major vendors of the Java industry.

• Hibernate implements the Java Persistence object/relational mapping and persistence management interfaces with the Hibernate Annotations and Hibernate EntityManager modules, on top of the mature and powerful Hibernate Core.

• The Hibernate modules can be stacked and combined as desired. You can use the Hibernate Java Persistence provider in any environment, Java SE 5.0 or Java EE 5.0. The Hibernate Java Persistence provider is fully certified and passes the Sun TCK.

Page 4: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Hibernate Annotations• Project Lead: Emmanuel BernardLatest release: 3.4.0 GA

(Changelog) (Road Map)Release date: 20.08.2008Requirements: Hibernate Core 3.3.x, JDK 5.0Hibernate, like all other object/relational mapping tools, requires metadata that governs the transformation of data from one representation to the other (and vice versa). As an option, you can now use JDK 5.0 annotations for object/relational mapping with Hibernate 3.2. You can use annotations in addition to or as a replacement of XML mapping metadata.

• The Hibernate Annotations package includes:• Standardized Java Persistence and EJB 3.0 (JSR 220)

object/relational mapping annotations• Hibernate-specific extension annotations for performance

optimization and special mappings• You can use Hibernate extension annotations on top of

standardized Java Persistence annotations to utilize all native Hibernate features.

Page 5: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

More jar file downloads

• You will need persistence and ejb jar files: ejb, persistence, jndi, geronimo-ejb, ejb3-persistence and javaee.

• Many Hibernate tutorials out there:• http://www.hibernate.org/hib_docs/reference/

en/html/tutorial.html• http://www.roseindia.net/hibernate/index.shtml• http://www.hibernate.org/hib_docs/reference/

en/html/tutorial-webapp.html• http://www.inf.ed.ac.uk/teaching/courses/ec/

handouts/quickstart.pdf

Page 6: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Hibernate tutorials

• Various modified/new tutorials appear here. I used mysql, but that is not a requirement.

• Hibernate standardizes the db interface. A config file specifies the actual db service and the dialect to use, and other config files, called hbm, map the individual tables. Instead of provider-specific connection and query details, the program uses the hibernate “interface” to interact with the database.

Page 7: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

A hibernate app (not a web app!)

Will consist of • one or more classes (POJOs) to be populated

from/copied to database tables.• A mapping file for each named

classname.hbm.xml mapping each to the database table it corresponds to

• Configuration files as needed for log4j and hibernate… especially hibernate.cfg.xml

• A controller class• And so on…

Page 8: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

First hibernate tutorial

• Using hibernate with a mysql database and a few simple java classes.

• Link for tutorial: http://www.hibernate.org/hib_docs/reference/en/html/tutorial-firstapp.html

• This tutorial has many omissions, most notably library jar files needed. I also had to modify some classes (HibernateUtil).

• It does come with an ant build

Page 9: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Directory structure

• Appdir– bin– src

• log4j.properties• hibernate.cfg.xml• Event.hbm.xml• hibernate.properties --- not included in this example• events(dir)

– Event.java• util(dir)

– EventManager.java– HibernateUtil.java

– lib

Page 10: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Notes about lib

• You’ll need• Hibernate• Cp30• Antlr• Jta• Dom4j• Commons logging• Just 2 files from slf4j…note screen shot

Page 11: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

My lib directory

Page 12: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

build.xml<project name="hibernate-tutorial" default="compile"> <property name="sourcedir" value="${basedir}/src"/> <property name="targetdir" value="${basedir}/bin"/> <property name="librarydir" value="${basedir}/lib"/> <path id="libraries"> <fileset dir="${librarydir}"> <include name="*.jar"/> </fileset> </path> <target name="clean"> <delete dir="${targetdir}"/> <mkdir dir="${targetdir}"/> </target> <target name="compile" depends="clean, copy-resources"> <javac srcdir="${sourcedir}" destdir="${targetdir}" classpathref="libraries"/> </target> <target name="copy-resources"> <copy todir="${targetdir}"> <fileset dir="${sourcedir}"> <exclude name="**/*.java"/> </fileset> </copy> </target><target name="run" depends="compile"> <java fork="true" classname="events.EventManager" classpathref="libraries"> <classpath path="${targetdir}"/> <arg value="${action}"/> </java></target></project>

Page 13: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

HibernateUtil.java

• This class gets the hibernate session factory or throws an exception

• With minor variations it appears in many hibernate applications

Page 14: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

HibernateUtil.javapackage util;import org.hibernate.*;import org.hibernate.cfg.*;public class HibernateUtil { private static final SessionFactory sessionFactory; static { try {

System.out.println("in try for build session factory"); // Create the SessionFactory from hibernate.cfg.xml sessionFactory = new Configuration().configure().buildSessionFactory(); System.out.println("back from build session factory"); } catch (Throwable ex) { // Make sure you log the exception, as it might be swallowed System.err.println("Initial SessionFactory creation failed." + ex); System.out.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; }}

Page 15: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

EventManager.java (also in slide notes)… a controller class for handling “events”

package events;import org.hibernate.*;import org.hibernate.cfg.*;import java.util.Date;import java.util.*;import util.HibernateUtil;public class EventManager { public static void main(String[] args) {//main EventManager mgr = new EventManager();System.out.println("Event Manager before if") ; /////I stuck in all these println if (args[0].equals("store")) {//if------A store command System.out.println("create and store");

mgr.createAndStoreEvent("My Event", new Date()); }//if else if (args[0].equals("list")) {//------A list command

System.out.println("list events"); List events = mgr.listEvents(); for (int i = 0; i < events.size(); i++) { Event theEvent = (Event) events.get(i); System.out.println("Event: " + theEvent.getTitle() + " Time: " + theEvent.getDate()); }

}System.out.println("Event Manager: completed if"); HibernateUtil.getSessionFactory().close(); }

Page 16: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

EventManager.java continuedprivate List listEvents() {System.out.println("Event Manager... in list events method"); SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); Session session =sessionFactory.openSession(); session.beginTransaction(); List result = session.createQuery("from Event").list(); session.getTransaction().commit(); return result;} private void createAndStoreEvent(String title, Date theDate) {System.out.println("Event Manager... create and store method"); SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); Session session =sessionFactory.openSession();System.out.println(".. before begin transaction"); session.beginTransaction();System.out.println(".. transaction started"); Event theEvent = new Event(); theEvent.setTitle(title); theEvent.setDate(theDate);

session.save(theEvent);System.out.println("session save completed"); session.getTransaction().commit(); System.out.println("after commit in create and save"); }}

Page 17: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Event.javapackage events;import java.util.Date;public class Event { private Long id; private String title; private Date date;//Eclipse or Netbeans will build the rest… default constructor and getter/setters public Event() {} public Long getId() { return id; } private void setId(Long id) { this.id = id; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; }}

Page 18: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Event.hbm.xml --such a file (and the corresponding java class) is needed for each table

mapped…note how primary key autoincrement primary key appears

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<class name="events.Event" table="EVENTS"> <id name="id" column="EVENT_ID"> <generator class="native"/> </id> <property name="date" type="timestamp" column="EVENT_DATE"/> <property name="title"/>

</class>

</hibernate-mapping>

Page 19: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

hibernate.cfg.xml contains connection info, db name, user name & pw and other information

<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- Database connection settings --><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="connection.url">jdbc:mysql://localhost/mydb</property><property name="connection.username">root</property><property name="connection.password"></property><!-- JDBC connection pool (use the built-in) --> <property name="hibernate.connection.pool_size">10</property><!-- MySQL dialect//different for different Database --><property name="dialect">org.hibernate.dialect.MySQLDialect</property><!-- Echo all executed SQL to stdout --><property name="show_sql">true</property><property name="hbm2ddl.auto">update</property><mapping resource="Event.hbm.xml"/></session-factory></hibernate-configuration>

Page 20: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Log4j.properties log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.outlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p

%c{1}:%L - %m%nlog4j.rootLogger=info, stdoutlog4j.logger.org.hibernate.test=infolog4j.logger.org.hibernate.tool.hbm2ddl=debug

Page 21: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

remark

• You’ll need to create a mysql database and table for this example and you need to start the database server before running the example.

• Run the example in the root directory on the commandline either with

ant run –Daction=store• Orant run –Daction=list

Page 22: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

First tutorial…output for storeC:\hibernateexample>ant run -Daction=storeBuildfile: build.xml

clean: [delete] Deleting directory C:\hibernateexample\bin [mkdir] Created dir: C:\hibernateexample\bin

copy-resources: [copy] Copying 6 files to C:\hibernateexample\bin [copy] Copied 2 empty directories to 1 empty directory under C:\hibernateexample\bin

compile: [javac] Compiling 3 source files to C:\hibernateexample\bin

run: [java] Event Manager before if [java] create and store [java] Event Manager... create and store method [java] in try for build session factory<<<omitted a lot…see slide notes>>> [java] 719 [main] INFO org.hibernate.tool.hbm2ddl.SchemaUpdate - schema update complete [java] back from build session factory [java] .. before begin transaction [java] .. transaction started [java] Hibernate: insert into EVENTS (EVENT_DATE, title) values (?, ?) [java] session save completed [java] after commit in create and save [java] 907 [main] INFO org.hibernate.impl.SessionFactoryImpl - closing [java] 907 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - cleaning up connection pool: jdbc:mysql://localhost/mydb [java] Event Manager: completed if

BUILD SUCCESSFULTotal time: 2 secondsC:\hibernateexample>

Page 23: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Run –list …entirety in notesC:\hibernateexample>ant run -Daction=listBuildfile: build.xmlclean: …copy-resources: …compile: [javac] Compiling 3 source files to C:\hibernateexample\binrun:<<left out a lot of output here>>>> [java] 531 [main] INFO org.hibernate.impl.SessionFactoryImpl - building session factory [java] 719 [main] INFO org.hibernate.impl.SessionFactoryObjectFactory - Not binding factory to JNDI, no JNDI name configured …[title, event_date, event_id] [java] 734 [main] INFO org.hibernate.tool.hbm2ddl.TableMetadata - foreign keys: [] [java] 734 [main] INFO org.hibernate.tool.hbm2ddl.TableMetadata - indexes:[event_id] [java] 734 [main] INFO org.hibernate.tool.hbm2ddl.SchemaUpdate - schema update complete [java] back from build session factory [java] Hibernate: select event0_.EVENT_ID as EVENT1_0_, event0_.EVENT_DATEas EVENT2_0_, event0_.title as title0_ from EVENTS event0_ [java] Event: My Event Time: 2009-03-03 00:00:00.0 [java] 1062 [main] INFO org.hibernate.impl.SessionFactoryImpl - closing [java] Event Manager: completed if [java] 1062 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - cleaning up connection pool: jdbc:mysql://localhost/mydb

BUILD SUCCESSFULTotal time: 2 secondsC:\hibernateexample>

Page 24: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Redo with a GUI…needs some improvement

Page 25: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

notes

• First, of course, get the tutorial working.• Modify the EventManager so it opens a JFrame

with two button, list and store.• Should have another button to delete * from

db/table)• Display stored events in a textarea.• Enter data for the event in a textfield.• The tutorial code uses a timestamp, but maybe

something else like a string with MM/DD/YY format would be nicer.

Page 26: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

So what’s the point of hibernate?

• A uniform connection (the session thingy) and sql dialect in your object. This doesn’t change as you port your application.

• The hibernate.cfg.xml (NOT your java code) gets modified if you port or change database servers.

Page 27: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

The hibernate webapp

• Recall a webapp consists of a servlet (class) sitting in a fixed directory structure, with a web.xml configuration file.

• A webapp requires a container (Tomcat, Jetty, JBoss,…) to run it.

• A server would typically include a (servlet) container.

Page 28: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Tomcat Web App Directory Structure

Your servlet container

Dir named Webapps

Dir named ROOT A webapp dir

Servlets- put html in here

WEB-INF

Other web app directories…

web.xml

Classes dir- put the packages/ .class files here

Page 29: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

WEB-INF\web.xml<?xml version="1.0" encoding="UTF-8"?><web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<servlet> <servlet-name>Event Manager</servlet-name> <servlet-class>events.EventManagerServlet</servlet-class> </servlet>

<servlet-mapping> <servlet-name>Event Manager</servlet-name> <url-pattern>/eventmanager</url-pattern> </servlet-mapping></web-app>

Page 30: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Where do files go? Shown in another slide but note…

• Hibernate.cfg goes in classes dir

• Event.hbm.xml goes into Events dir (I think) …if not, then into classes dir

Page 31: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

The 1-table hibernate web app

•     http://www.hibernate.org/hib_docs/reference/en/html/tutorial-webapp.html

• This tutorial came from hibernate.org. I think it is basically correct, although I made changes to the servlet trying to fix unrelated problems. I also used my own HibernateUtil class (shown in previous tutorial).

• Not very many details about the directory structure were given in the tutorial, but I give them here.

Page 32: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Servlet running in tomcat

Page 33: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Servlet entirety in slide notespackage events;import java.io.*;import java.net.*;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Iterator;import java.util.List;import javax.servlet.*;import javax.servlet.http.*;import util.HibernateUtil;import org.hibernate.*;public class EventManagerServlet extends HttpServlet {SessionFactory sessionFactory;Session session;

Page 34: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Servlet continuedprotected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); SimpleDateFormat dateFormatter = new SimpleDateFormat("dd.MM.yyyy"); PrintWriter out = response.getWriter(); out.println("<html><head><title>Event Manager</title></head><body>"); try {sessionFactory = HibernateUtil.getSessionFactory(); session =sessionFactory.openSession(); session.beginTransaction(); if ("store".equals(request.getParameter("action"))) { String eventTitle = request.getParameter("eventTitle"); String eventDate = request.getParameter("eventDate"); if ("".equals(eventTitle) || "".equals(eventDate)) { out.println("<b><i>Please enter event title and date.</i></b>"); } else {

System.out.println("before call to create and store"); createAndStoreEvent(eventTitle, dateFormatter.parse(eventDate)); out.println("<b><i>Added event.</i></b>"); } }printEventForm(out); listEvents(out, dateFormatter); // End unit of work //HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().commit(); session.getTransaction().commit();System.out.println("commit after save"); } catch (Exception ex) { HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().rollback(); throw new ServletException(ex); } }

Page 35: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Servlet continuedprivate void printEventForm(PrintWriter out) { out.println("<h2>Add new event:</h2>"); out.println("<form>"); out.println("Title: <input name='eventTitle' length='50'/><br/>"); out.println("Date (e.g. 24.12.2009): <input name='eventDate' length='10'/><br/>"); out.println("<input type='submit' name='action' value='store'/>"); out.println("</form>"); }

private void listEvents(PrintWriter out, SimpleDateFormat dateFormatter) {

List result = HibernateUtil.getSessionFactory().getCurrentSession().createCriteria(Event.class).list();

if (result.size() > 0) { out.println("<h2>Events in database:</h2>"); out.println("<table border='1'>"); out.println("<tr>"); out.println("<th>Event title</th>"); out.println("<th>Event date</th>"); out.println("</tr>"); for (Iterator it = result.iterator(); it.hasNext();) { Event event = (Event) it.next(); out.println("<tr>"); out.println("<td>" + event.getTitle() + "</td>"); out.println("<td>" + dateFormatter.format(event.getDate()) + "</td>"); out.println("</tr>"); } out.println("</table>"); } }

Page 36: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Servlet continuedprotected void createAndStoreEvent(String title, Date theDate) { Event theEvent = new Event(); theEvent.setTitle(title); theEvent.setDate(theDate);

HibernateUtil.getSessionFactory().getCurrentSession().save(theEvent); }

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); }

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); }}

Page 37: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Boldfaced line added to cfg<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- Database connection settings --><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="connection.url">jdbc:mysql://localhost/mydb</property><property name="connection.username">root</property><property name="connection.password"></property><!-- JDBC connection pool (use the built-in) --> <property name="hibernate.connection.pool_size">10</property><!-- MySQL dialect//different for different Database --><property name="dialect">org.hibernate.dialect.MySQLDialect</property><!-- Echo all executed SQL to stdout --><property name="show_sql">true</property><property name="hbm2ddl.auto">update</property><property name="current_session_context_class">thread</property> <mapping resource="Event.hbm.xml"/></session-factory></hibernate-configuration>

Page 38: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

build.xml (an app located at c:\myapp would have a war called C:\myapp.war)

<project name="hibernate-tutorial" default="compile"> <property name="sourcedir" value="${basedir}/src"/> <property name="targetdir" value="${basedir}/bin"/> <property name="librarydir" value="${basedir}/lib"/> <path id="libraries"> <fileset dir="${librarydir}"> <include name="*.jar"/> </fileset> </path> <target name="clean"> <delete dir="${targetdir}"/> <mkdir dir="${targetdir}"/> </target> <target name="compile" depends="clean, copy-resources"> <javac srcdir="${sourcedir}" destdir="${targetdir}" classpathref="libraries"/> </target> <target name="copy-resources"> <copy todir="${targetdir}"> <fileset dir="${sourcedir}"> <exclude name="**/*.java"/> </fileset> </copy> </target>

Page 39: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Build.xml continued<target name="run" depends="compile"> <java fork="true" classname="events.EventManager2"

classpathref="libraries"> <classpath path="${targetdir}"/> <arg value="${action}"/> </java></target><target name="war" depends="compile"> <war destfile="hibernate-tutorial.war" webxml="web.xml"> <lib dir="${librarydir}"> <exclude name="jsdk*.jar"/> </lib> <classes dir="${targetdir}"/> </war></target></project>

Page 40: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Package things in WEB-INF as shown here

• WEB-INF– classes (dir)

• events(dir)– Event.class (no changes to this file)– EventManagerServlet.class– Event.hbm.xml (no changes to this file)

• util(dir)– HibernateUtil.class (this file same as in previous project)

• Hibernate.cfg.xml

– lib(dir) (no changes to this)– log4j.properties(no changes to this)– web.xml (shown above)

Page 41: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Jar

I used jar instead of ant build:

jar –cvf appname.war WEB-INF

This creates a jar called appname.war with a dir in it named WEB-INF and all WEB-INF’s contents.

General syntax of jar is

jar –switch name-of.war list_of_files list_of_dirs

You’ll need to move files and directories as per web app structure before creating a war file.

Page 42: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

What’s next?

• CRUD against a database using one or more servlets, like your servlet database project, except use a hibernate interface.

Page 43: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Two examples: multiple tables & crud

• documentation http://www.hibernate.org/hib_docs/reference/en/html/

Page 44: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following
Page 45: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Adding to tables & listing

• I modified a previous example, adding a people table and displaying contents of two tables.

• I did not do a select, I just printed the event title in the same position. But since the numbers are allocated sequentially, I could have used select title from Event where id=number

Page 46: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

My tables

• My People table and my Event table both have ids as primary key, auto-incremented.

• In the hbm, these are identified as <id name=“some_field" column=“table_col"> <generator class="native"/> </id>

Page 47: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Dir structure

• WEB-INF– log4j.properties– web.xml– lib (contents shown later)– classes

• hibernate.cfg.xml• util

– Same HibernateUtil.java as previous• events

– Same Event.java as previous– People.java– EventManagerServlet.java– People.hbm.xml– Event.hbm.xml (unchanged from prev example)

Page 48: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

some of these may be unnecessary but I whittled it down some

Page 49: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Entire Servlet in notespackage events;import java.io.*;import java.net.*;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Iterator;import java.util.List;import javax.servlet.*;import javax.servlet.http.*;import util.HibernateUtil;import org.hibernate.*;public class EventManagerServlet extends HttpServlet {SessionFactory sessionFactory;List result1,result2;Session session; protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setContentType("text/html;charset=UTF-8"); SimpleDateFormat dateFormatter = new SimpleDateFormat("dd.MM.yyyy"); PrintWriter out = response.getWriter(); out.println("<html><head><title>Event Manager</title></head><body>"); try { // Begin unit of work // HibernateUtil.getSessionFactory().getCurrentSession().beginTransaction(); sessionFactory = HibernateUtil.getSessionFactory(); session =sessionFactory.openSession(); session.beginTransaction();

Page 50: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Servlet…print form, get session // Handle actions if ("store".equals(request.getParameter("action"))) {

String eventTitle = request.getParameter("eventTitle"); String eventDate = request.getParameter("eventDate");

String name = request.getParameter("name");String phone = request.getParameter("phone");

if ("".equals(eventTitle) || "".equals(eventDate)||name.equals("")||phone.equals("")) { out.println("<b><i>Please enter person, event title and date.</i></b>"); } else {

System.out.println("before call to create and store"); createAndStoreEvent(name, phone,eventTitle, dateFormatter.parse(eventDate)); out.println("<b><i>Added event.</i></b>"); } }

// Print page

printEventForm(out); System.out.println("back in process ...about to call listevents"); listEvents(out, dateFormatter);

// End unit of work //HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().commit(); session.getTransaction().commit();System.out.println("commit after save"); } catch (Exception ex) {

System.out.println(ex.toString()); HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().rollback(); throw new ServletException(ex); } }

Page 51: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Servlet: the form and table of events private void printEventForm(PrintWriter out) { out.println("<h2>Add new event:</h2>"); out.println("<form>"); out.println("Title: <input name='eventTitle' length='50'/><br/>"); out.println("Date (e.g. 24.12.2009): <input name='eventDate' length='10'/><br/>"); out.println("Contact person: <input name='name' length='50'/><br/>"); out.println("Phone(e.g. (123) 432-1111: <input name='phone' length='50'/><br/>"); out.println("<input type='submit' name='action' value='store'/>"); out.println("</form>"); }

private void listEvents(PrintWriter out, SimpleDateFormat dateFormatter) {

result1 = session.createCriteria(Event.class).list();

if (result1.size() > 0) { out.println("<h2>Event Info in database:</h2>"); out.println("<table border='1'>"); out.println("<tr>"); out.println("<th>Event title</th>"); out.println("<th>Event date</th>"); out.println("<th>Event id</th>"); out.println("</tr>");

for (Iterator it = result1.iterator(); it.hasNext();) {

Event event = (Event) it.next(); out.println("<tr>");

out.println("<td>" + event.getTitle()+ "</td>"); out.println("<td>" + dateFormatter.format(event.getDate()) + "</td>"); out.println("<td>" + event.getId() + "</td>"); out.println("</tr>"); } out.println("</table>");}//if

Page 52: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Servlet… list table of peopleint num=0; result2 = session.createCriteria(People.class).list();

if (result2.size() > 0) { out.println("<h2>People Info in database:</h2>"); out.println("<table border='1'>"); out.println("<tr>"); out.println("<th>Person</th>"); out.println("<th>Phone</th>"); out.println("<th>Event coordinating</th>"); out.println("</tr>");

String unknown="unknown"; for (Iterator it = result2.iterator(); it.hasNext();) {

People person=(People)it.next(); out.println("<tr>"); out.println("<td>" + person.getName() + "</td>"); out.println("<td>" + person.getPhone() + "</td>");

out.println("<td>" + ((Event)result1.get(num)).getTitle() + "</td>");num++;

out.println("</tr>"); } out.println("</table>");

}}

Page 53: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Create and storeprotected void createAndStoreEvent(String name,String phone,String title, Date theDate) {

System.out.println("in create and store method"); Event theEvent = new Event(); People person=new People(); theEvent.setTitle(title); theEvent.setDate(theDate);

person.setName(name); person.setPhone(phone); System.out.println("about to get current session and save event"); session.save(theEvent); System.out.println("about to get current session and save person"); session.save(person); System.out.println("done with saves"); }

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("in do get"); processRequest(request, response); }

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

System.out.println("in do post"); doGet(request, response); }}

Page 54: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

events.People.javapublic class People{ private String name; private String phone; private long id; public People() {}

public long getId(){return id;}

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

public String getName() { return name; }

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

public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; }}

Page 55: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

The primary key may be generated, native or assigned. The strategy must be specified in the

hbm.xml. This is People.hbm.xml<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping> <class name="events.People" table="people"> <id name="id" column="id"> <generator class="native"/> </id> <property name="name"/> <property name="phone"/> </class>

</hibernate-mapping>

Page 56: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Same hibernate.cfg.xml except People table has been added.

<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- Database connection settings --><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="connection.url">jdbc:mysql://localhost/mydb</property><property name="connection.username">root</property><property name="connection.password"></property><!-- JDBC connection pool (use the built-in) --> <property name="hibernate.connection.pool_size">10</property><!-- MySQL dialect//different for different Database --><property name="dialect">org.hibernate.dialect.MySQLDialect</property><property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property><!-- Echo all executed SQL to stdout --><!-- Echo all executed SQL to stdout --><property name="show_sql">true</property><property name="hbm2ddl.auto">update</property><property name="current_session_context_class">thread</property> <mapping resource="events/Event.hbm.xml"/><mapping resource="events/People.hbm.xml"/></session-factory></hibernate-configuration>

Page 57: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

ant build – still needs to be modified to build WEB-INF and classes dirs, and copy files to there, then jar

<project name="hibernate-tutorial" default="compile"> <property name="sourcedir" value="${basedir}/src"/> <property name="targetdir" value="${basedir}/bin"/> <property name="librarydir" value="${basedir}/lib"/> <path id="libraries"> <fileset dir="${librarydir}"> <include name="*.jar"/> </fileset> </path> <target name="clean"> <delete dir="${targetdir}"/> <mkdir dir="${targetdir}"/> </target> <target name="compile" depends="clean, copy-resources"> <javac srcdir="${sourcedir}" destdir="${targetdir}" classpathref="libraries"/> </target> <target name="copy-resources"> <copy todir="${targetdir}"> <fileset dir="${sourcedir}"> <exclude name="**/*.java"/> </fileset> </copy> </target><target name="war" depends="compile"> <war destfile="HibernateApp2.war" webxml="web.xml"> <lib dir="${librarydir}"> </lib> <classes dir="${targetdir}"/> </war></target></project>

Page 58: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

CRUD example

• The student table

Page 59: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Hibernate student info servlet

Page 60: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

remarks

• Just one table marked• Link above gives good information on how

to conduct queries.• I used radiobuttons to indicate function

desired.• I used the same ant/build and jar

commands as before.• Same directory structure.• Servlet in slide notes

Page 61: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Student.hbm.xml<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<class name="data.Student" table="Students"> <id name="id" column="id"> <generator class="native"/> </id> <property name="name"/> <property name="age"/> <property name="gpa"/> <property name="sex"/> <property name="year"/> </class>

</hibernate-mapping>

Page 62: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Some bits of the servlettry { // Begin unit of work // HibernateUtil.getSessionFactory().getCurrentSession().beginTransaction(); sessionFactory = HibernateUtil.getSessionFactory(); session =sessionFactory.openSession(); session.beginTransaction(); if ("store".equals(request.getParameter("action"))) { String name = request.getParameter("name"); String gpa = request.getParameter("gpa");

String year = request.getParameter("year");String age = request.getParameter("age");String sex = request.getParameter("sex");

if ("".equals(name) || "".equals(sex)||year.equals("")||gpa.equals("")||age.equals("")) { out.println("<b><i>Please enter name, age, sex, gpa, year and sex.</i></b>"); } else {

System.out.println("before call to create and store"); createAndStoreEvent(name, age,year,sex,gpa); out.println("<b><i>Added event.</i></b>"); } } else if ("list".equals(request.getParameter("action"))) { // Print page System.out.println("back in process ...about to call listevents"); listStudents(out);

}

Page 63: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Delete action

else if ("delete".equals(request.getParameter("action"))) {String name = request.getParameter("name");List marked=session.createQuery("from Student as student where student.name=?").setString(0,name).list();if(marked.size()>0){ Student student=(Student)marked.get(0);out.println("deleting...."+ student.getName());session.delete(student); }else {out.println("no match found");}

Page 64: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

}else{//update String name = request.getParameter("name");

String gpa = request.getParameter("gpa"); String year = request.getParameter("year"); String age = request.getParameter("age"); String sex = request.getParameter("sex");List marked=session.createQuery("from Student as student where student.name=?").setString(0,name).list(); if(marked.size()>0&&!"".equals(sex)&&!year.equals("")&&!gpa.equals("")&&!age.equals("")) {

Student student=(Student)marked.get(0); student.setAge(Integer.parseInt(age));

student.setYear(year);student.setGpa(Double.parseDouble(gpa));student.setSex(sex); session.update(student); }

else {out.println("no match found");} } /*else a getinfo choice could look about the same */

Page 65: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

I used radiobuttonsprivate void printStudentForm(PrintWriter out) { out.println("<h2>Student info form:</h2>"); out.println("<form>"); out.println("Name: <input name='name' length='40'/><br/>"); out.println("Age: <input name='age' length='10'/><br/>"); out.println("Sex(Male/Female): <input name='sex' length='10'/><br/>"); out.println("Year: <input name='year' length='15'/><br/>"); out.println("GPA: <input name='gpa' length='10'/><br/>"); out.println("<input type='radio' name='action' value='list'> List<br>");

out.println(" <input type='radio' name='action' value='store' checked> Store<br>");

out.println("<input type='radio' name='action' value='update'> Update<br>");

out.println(" <input type='radio' name='action' value='delete'> Delete<br>");

out.println("<input type='submit' />"); out.println("</form>"); }

Page 66: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

List studentsprivate void listStudents(PrintWriter out) {

result1 = session.createCriteria(Student.class).list();

if (result1.size() > 0) { out.println("<h2>Student Info:</h2>"); out.println("<table border='1'>"); out.println("<tr>"); out.println("<th>Student name</th>"); out.println("<th>Student Age</th>"); out.println("<th>GPA</th>"); out.println("<th>Sex</th>"); out.println("<th>Year</th>"); out.println("</tr>");

for (Iterator it = result1.iterator(); it.hasNext();) {

Student student = (Student) it.next(); out.println("<tr>");

out.println("<td>" + student.getName()+ "</td>"); out.println("<td>" + student.getAge() + "</td>"); out.println("<td>" + student.getGpa() + "</td>"); out.println("<td>" + student.getSex() + "</td>"); out.println("<td>" + student.getYear() + "</td>"); out.println("</tr>"); } out.println("</table>");}//if

}

Page 67: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

Hibernate configuration<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- Database connection settings --><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="connection.url">jdbc:mysql://localhost/mydb</property><property name="connection.username">root</property><property name="connection.password"></property><!-- JDBC connection pool (use the built-in) --> <property name="hibernate.connection.pool_size">10</property><!-- MySQL dialect//different for different Database --><property name="dialect">org.hibernate.dialect.MySQLDialect</property><!-- Echo all executed SQL to stdout --><property name="show_sql">true</property><property name="hbm2ddl.auto">update</property><mapping resource="Student.hbm.xml"/></session-factory></hibernate-configuration>

Page 68: Hibernate. Hibernate is a powerful, high performance object/relational persistence and query service. Hibernate lets you develop persistent classes following

web-xml<?xml version="1.0" encoding="UTF-8"?><web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<servlet> <servlet-name>StudentInfo</servlet-name> <servlet-class>data.StudentInfoServlet</servlet-class> </servlet>

<servlet-mapping> <servlet-name>StudentInfo</servlet-name> <url-pattern>/studentinfo</url-pattern> </servlet-mapping></web-app>