764_18.2a_Gardner_Hibernate
Download
Report
Transcript 764_18.2a_Gardner_Hibernate
Java Data Persistence
Using Hibernate
Jack Gardner
October 2004
Overview
What is Hibernate
Session
What is ORM
Transaction
Create Example
Object Lifecycle
Read Examples
Query Options
Persistable Classes
Associations
Database Table
References
Mapping Class to Table
Configuration
Configuration Properties
2
What is Hibernate?
An object/relational mapping (ORM)
implementation
Open source
Development started late 2001
3
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
4
Create Example
// create a new object
Widget w = new Widget();
w.setName(“WidgetA”);
w.setValue(10);
// persist it
session.save(w);
5
Read Examples
// get a known widget
Widget w = (Widget) session.load(Widget.class,
“WidgetA”);
// get all widgets
List widgets = session.find(“from Widget”);
6
Persistable Classes
Classes are simply JavaBeans
public class Widget
{
private String name;
private int value;
public
public
public
public
public
Widget() {}
String getName() {return name;}
void setName(String s) {name = s;}
int getValue() {return value;}
void setValue(int i) {value = i;}
}
7
Database Table
Persistable classes have an associated table
8
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>
9
Configuration
import net.sf.hibernate.cfg.Configuration;
import net.sf.hibernate.SessionFactory;
// build configuration based on properties
Configuration config = new Configuration();
// add persistable classes to configuration
config.addClass(Widget.class);
// build a session factory based on configuration
SessionFactory sessionFactory =
config.buildSessionFactory();
10
Configuration Properties
hibernate.properties
hibernate.dialect=net.sf.hibernate.dialect.Oracle9Dialect
hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver
hibernate.connection.url=jdbc:oracle:thin:@oracle.cis.ksu.edu:1521:ORACLE
hibernate.connection.username=<myusername>
hibernate.connection.password=<mypassword>
11
Session
Lightweight and inexpensive to create/destroy
Not threadsafe – each thread needs its own
Obtained from SessionFactory instance
Session session = sessionFactory.openSession();
// perform persistence operations
session.close();
12
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 operations
tx.commit();
13
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
14
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 API
Criteria c = session.createCriteria(Widget.class);
c.add(Expression.gt(“value”, someValue);
List widgets = c.list();
SQL
Query q = session.createSQLQuery(“select {w.*} from
WIDGET {w} where VALUE > :value”, “w”, Widget.class);
q.setParameter(“value”, someValue);
List widgets = q.list();
15
Associations
Supports all association types
one-to-one
one-to-many
many-to-many
Inherently unidirectional
Supports bidirectional
16
One-to-Many Example:
Unidirectional
Option 1: Group Member
public class Group
{
private String name;
private Collection members;
…
}
public class Member
{
private String name;
…
}
Option 2: Group Member
public class Group
{
private String name;
…
}
public class Member
{
private String name;
private Group group;
…
}
17
One-to-Many Example:
Bidirectional
Group Member
public class Group
{
private String name;
private Collection members;
…
}
public class Member
{
private String name;
private Group group;
…
}
Application responsible for maintaining each
end of association
18
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
19
One-to-Many Table Structure
20
Many-to-Many Example:
Unidirectional
Option 1: Group Member
public class Group
{
private String name;
private Collection members;
…
}
public class Member
{
private String name;
…
}
Option 2: Group Member
public class Group
{
private String name;
…
}
public class Member
{
private String name;
private Collection groups;
…
}
21
Many-to-Many Example:
Bidirectional
Group Member
public class Group
{
private String name;
private Collection members;
…
}
public class Member
{
private String name;
private Collection groups;
…
}
Application responsible for maintaining each
end of association
22
Many-to-Many Table Structure
Underlying table structure not affected by
directionality
Implemented using join table
23
Many-to-Many Table Structure
24
References
Bauer, Christian and Gaven King, Hibernate
in Action, Manning, 2005.
Hibernate Reference Documentation, Version
2.1.6, Hibernate, 2004.
25