Java Data Persistence Using Hibernate
description
Transcript of Java Data Persistence Using Hibernate
2
Overview
What is Hibernate What is ORM Create Example Read Examples Persistable Classes Database Table Mapping Class to Table Configuration Configuration Properties
Session Transaction Object Lifecycle Query Options Associations References
3
What is Hibernate?
An object/relational mapping (ORM) implementation
Open source Development started late 2001
4
What is Object/Relational Mapping?
Provides a transparent bridge between objects and database tables
Allows source code to work with objects and their attributes vs. tables and columns
Eliminates need for most/all SQL Eliminates use of query result sets
5
Create Example
// create a new objectWidget w = new Widget();w.setName(“WidgetA”);w.setValue(10);
// persist itsession.save(w);
6
Read Examples
// get a known widgetWidget w = (Widget) session.load(Widget.class,
“WidgetA”);
// get all widgetsList widgets = session.find(“from Widget”);
7
Persistable Classes
Classes are simply JavaBeans
public class Widget{
private String name;private int value;
public Widget() {}public String getName() {return name;}public void setName(String s) {name = s;}public int getValue() {return value;}public void setValue(int i) {value = i;}
}
9
Mapping Class to Table
widget.hbm.xml
<hibernate-mapping><class name=“mypackage.Widget” table=“WIDGET”>
<id name=“name” column=“NAME”> <generator class=“assigned”/></id><property name=“value” column=“VALUE”/>
</class></hibernate-mapping>
10
Configuration
import net.sf.hibernate.cfg.Configuration;import net.sf.hibernate.SessionFactory;
// build configuration based on propertiesConfiguration config = new Configuration();
// add persistable classes to configurationconfig.addClass(Widget.class);
// build a session factory based on configurationSessionFactory sessionFactory =
config.buildSessionFactory();
11
Configuration Properties
hibernate.propertieshibernate.dialect=net.sf.hibernate.dialect.Oracle9Dialecthibernate.connection.driver_class=oracle.jdbc.driver.OracleDriverhibernate.connection.url=jdbc:oracle:thin:@oracle.cis.ksu.edu:1521:ORACLEhibernate.connection.username=<myusername>hibernate.connection.password=<mypassword>
12
Session
Lightweight and inexpensive to create/destroy Not threadsafe – each thread needs its own Obtained from SessionFactory instance
Session session = sessionFactory.openSession();// perform persistence operationssession.close();
13
Transaction
Set of operations that are all committed or all rolled back
Obtained from Session instance Can perform multiple transactions within
session
Transaction tx = session.beginTransaction();// perform persistence operationstx.commit();
14
Object Lifecycle
Transient Newly created object
Persistent New object has been “saved” Previously saved object has been “read”
Detached Session closed Persistent object serialized Can be reattached later to become persistent
15
Query Options
Hibernate Query Language (HQL)Query q = session.createQuery(“from Widget w where w.value > :value”);q.setParameter(“value”, someValue);List widgets = q.list();
Criteria APICriteria c = session.createCriteria(Widget.class);c.add(Expression.gt(“value”, someValue);List widgets = c.list();
SQLQuery q = session.createSQLQuery(“select {w.*} from WIDGET {w} where VALUE > :value”, “w”, Widget.class);q.setParameter(“value”, someValue);List widgets = q.list();
16
Associations
Supports all association types one-to-one one-to-many many-to-many
Inherently unidirectional Supports bidirectional
17
One-to-Many Example: Unidirectional Option 1: Group Member
public class Group public class Member{ { private String name; private String name; private Collection members; … … }}
Option 2: Group Memberpublic class Group public class Member{ { private String name; private String name; … private Group group;} …
}
18
One-to-Many Example: Bidirectional Group Member
public class Group public class Member{ { private String name; private String name; private Collection members; private Group group; … …} }
Application responsible for maintaining each end of association
19
One-to-Many Table Structure
Underlying table structure not affected by directionality
Standard implementation Foreign key in many-side table
Alternate implementation Use join table, with no-duplicate constraint on
many-side foreign key
21
Many-to-Many Example: Unidirectional Option 1: Group Member
public class Group public class Member{ { private String name; private String name; private Collection members; … … }}
Option 2: Group Memberpublic class Group public class Member{ { private String name; private String name; … private Collection groups;} …
}
22
Many-to-Many Example: Bidirectional Group Member
public class Group public class Member{ {
private String name; private String name; private Collection members; private Collection
groups; … …
} }
Application responsible for maintaining each end of association
23
Many-to-Many Table Structure
Underlying table structure not affected by directionality
Implemented using join table