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