You are on page 1of 92

OpenDoc Series

Hibernate
V1.0
xiaxin(at)gmail.com

So many open source projects. Why not Open your Documents? J

Hibernate Developers Guide

Version 1.0

xiaxin(at)gmail.com

(at) email @

0.9

2004.5.1

1.0

2004.9.1

Hibernate in Spring

OpenDoc

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Hibernate
2003

Hibernate
Hibernate

Hibernate ReferenceHibernate Reference

Hibernate
Hibernate Reference
Hibernate
Hibernate Reference Hibernate Release
http://www.redsaga.com Hibernate Reference

September 2, 2004

So many open source projects. Why not Open your Documents?

Version 1.0

Hibernate Developers Guide

Version 1.0

Hibernate .......................................................................................................3
..........................................................................................................5
Hibernate ...............................................................................5
...........................................................................6
Hibernate ..............................................................................................17
....................................................................................................19
Hibernate ......................................................................................21
Configuration ........................................................................................21
SessionFactory.......................................................................................22
Session ....................................................................................................22
Hibernate ......................................................................................................24
XDoclet Hibernate ...........................................................................24
........................................................................................................33
Criteria Query ...............................................................................33
Criteria ................................................................33
Criteria ....................................................................35
.............................................................35
.............................................................35
Hibernate Query Language (HQL).........................................36
........................................................................................................37
.............................................................................37
.............................................................................39
......................................................39
......................................................44
.............................................................................49
........................................................................................................56
PO VO ...............................................................................................56
unsaved-value ...............................................................................59
Inverse Cascade .........................................................................61
Lazy Loading............................................................61
........................................................................................................65
JDBC .........................................................................66
JTA ...........................................................................67
locking.........................................................................................70
Pessimistic Locking .......................................70
Optimistic Locking..........................................71
Hibernate ..........................................................................................75
Cache ....................................................................................................77
Session ...............................................................................................81
Hibernate in Spring ...........................................................................................86
........................................................................................................................92

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Hibernate
Quick Start

1 Ant C:\ant\
bin c:\ant\bin
PATH
2 HibernateHibernate-Extension Middlegen-Hibernate
http://prdownloads.sourceforge.net/hibernate/

Hibernate
Hibernate
1 POJO
POJO Hibernate Domain Object POJO
Plain Ordinary Java Object
Java
Value Object VO

POJO
public class TUser implements Serializable {
private String name;
public User(String name) {
this.name = name;
}
/** default constructor */
public User() {
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}

2 Hibernate
Hibernate Object Relational
Mapping ORM
POJO ORM Object
MappingObjectRelational

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Hibernate .hbm.xml
Hibernate
1
2 ORM Java

ORM Java
3 Java Java
POJO
xdoclet

xdoclet POJO

Hibernate MiddleGen for Hibernate Hibernate_Extension


ORM POJO
1)

Middlegen-Hibernate C:\Middlegen\

MiddleGen \config\database
mysql mysql.xml
2)

<property name="database.script.file"
value="${src.dir}/sql/${name}-mysql.sql"/>
<property name="database.driver.file"
value="${lib.dir}/mysql.jar"/>
<property name="database.driver.classpath"
value="${database.driver.file}"/>
<property name="database.driver"
value="org.gjt.mm.mysql.Driver"/>
<property name="database.url"
value="jdbc:mysql://localhost/sample"/>
<property name="database.userid"
value="user"/>

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

<property name="database.password"
value="mypass"/>
<property name="database.schema"
value=""/>
<property name="database.catalog"
value=""/>
<property name="jboss.datasource.mapping"
value="mySQL"/>

url

3)

Build.xml
MiddleGen build.xml Middlegen-Hibernate Ant
Middlegen-Hibernate build.xml

a)
!ENTITY
<!DOCTYPE project [
<!ENTITY database SYSTEM
"file:./config/database/hsqldb.xml">
]>

MiddleGen hsqldb.xml
mysql.xml

<!DOCTYPE project [
<!ENTITY database SYSTEM
"file:./config/database/mysql.xml">
]>

b) Application name

<property name="name" value="airline"/>

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

aireline MiddleGen Application Name


HibernateSample
<property name="name" value="HibernateSample"/>

c)
name="build.gen-src.dir"

<property name="build.gen-src.dir"
value="${build.dir}/gen-src"/>

value="${build.dir}/gen-src"

<property name="build.gen-src.dir"
value="C:\sample"/>

d) Package name
destination

<hibernate
destination="${build.gen-src.dir}"
package="${name}.hibernate"
genXDocletTags="false"
genIntergratedCompositeKeys="false"
javaTypeMapper=
"middlegen.plugins.hibernate.HibernateJavaTypeMapper"
/>

hibernate package
Application Name ${name}.hibernate

<hibernate
destination="${build.gen-src.dir}"
package="org.hibernate.sample"
genXDocletTags="true"
genIntergratedCompositeKeys="false"
javaTypeMapper=
"middlegen.plugins.hibernate.HibernateJavaTypeMapper"
/>

genXDocletTags true

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

xdoclet tag xdoclet


Hibernate xdoclet
SQLServer build.xml
Middlegen
<middlegen
appname="${name}"
prefsdir="${src.dir}"
gui="${gui}"
databaseurl="${database.url}"
initialContextFactory="${java.naming.factory.initial}"
providerURL="${java.naming.provider.url}"
datasourceJNDIName="${datasource.jndi.name}"
driver="${database.driver}"
username="${database.userid}"
password="${database.password}"
schema="${database.schema}"
catalog="${database.catalog}"
>
MiddleGen MiddleGen ant
MiddleGen

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

MiddleGen

Domain Class Name


POJO

Key Generator

1) Assigned

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Hibernate
2) hilo
hi/lo

3) seqhilo
hilo hi/lo
Sequence
Sequence
Oracle
4) increment

5) identity
DB2SQL ServerMySQL

6) sequence
sequence Oralce
Sequence
7) native
Hibernate identityhilosequence

8) uuid.hex
Hibernate 128 16
32
9) uuid.string
uuid.hex 16

PostgreSQL

10) foreign

uuid.hex

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

OracleDB2SQLServerMySql
Auto-Increase Sequence

generator-class=native

insert

Insert

Insert uuid.hex

net.sf.hibernate.id.IdentifierGenerator

Schema Name
Schema Name

Persister
Hibernate
LDAP
POJO

Enable proxies
[Lazy Loading]

Dynamic Update
Update SQL
SQL

Mutable

Delete Update

Implement the Lifecyle interface


Lifecyle Lifecyle

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Lifecyle Call Back

10 Implement the Validatable interface


Validatable Validatable

Lifecyle
Validatable validate
Validatable validate

Class MiddleGen
MiddleGen

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Hibernate mapping specialty

Key

Property
Version optimistic locking
optimistic locking

Java property name

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Java
3

Java Type
Java

Column updateable
Update SQL

Column insertable
Insert SQL

Generate MiddleGen
Hibernate
MiddleGen \build\gen-src\net\hibernate\sample
.hbm.xml

POJO
POJO Hibernate Extension Hibernate Extension
tools\bin
1 hbm2java.bat
POJO MiddleGen
hbm2java.bat POJO
2 class2hbm.bat
POJO class
3 ddl2hbm.bat
POJO MiddleGen

MiddleGen hbm2java
POJO
tools\bin\setenv.bat
JDBC_DRIVER HIBERNATE_HOME
JDBC Driver
Hibernate
set JDBC_DRIVER=c:\mysql\mysql.jar
set HIBERNATE_HOME=c:\hibernate
CP %CORELIB% jar

%CORELIB%\commons-logging.jar, Hibernate

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

commons-logging-1.0.3.jar

hbm2java MiddleGen Java


Command Window tools\bin
hbm2java c:\sample\org\hibernate\sample\*.xml --output=c:\sample\
POJO POJO c:\sample

MiddleGen Hibernate
MiddleGen Eclipse
Hibernate Plugin Plugin

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Hibernate
POJO Hibernate

Hibernate xml properties


xml xml
properties Hard Coding
xml
hibernate.cfg.xml
hibernate.properties
Hibernate
CLASSPATH

CLASSPATH Web
\WEB-INF\classes
hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.
dtd">
<hibernate-configuration>
<!- SessionFactory -->
<session-factory>
<!- URL -->
<property name="hibernate.connection.url">
jdbc:mysql://localhost/sample
</property>
<!- JDBC -->
<property name="hibernate.connection.driver_class">
org.gjt.mm.mysql.Driver
</property>
<!- -->
<property name="hibernate.connection.username">
User
</property>
<!- -->
<property name="hibernate.connection.password">

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Mypass
</property>
<!--dialect Dialet -->
<property name="dialect">
net.sf.hibernate.dialect.MySQLDialect
</property>
<!- SQL -->
<property name="hibernate.show_sql">
True
</property>
<!- -->
<property name="hibernate.use_outer_join">
True
</property>
<!- JDBC Transaction -->
<property name="hibernate.transaction.factory_class">
net.sf.hibernate.transaction.JDBCTransactionFactory
</property>
<! -->
<mapping resource="net/xiaxin/xdoclet/TUser.hbm.xml"/>
<mapping resource="net/xiaxin/xdoclet/TGroup.hbm.xml"/>
</session-factory>
</hibernate-configuration>

hibernate.properties
hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class org.gjt.mm.mysql.Driver
hibernate.connection.driver_class com.mysql.jdbc.Driver
hibernate.connection.url jdbc:mysql:///sample
hibernate.connection.username user
hibernate.connection.password mypass

September 2, 2004

So many open source projects. Why not Open your Documents?

Version 1.0

Hibernate Developers Guide

Version 1.0

Hiberante
Hibernate
JUnit TestCase TUser
JUnit JUnit
public class HibernateTest extends TestCase {
Session session = null;
/**
* JUnitsetUpTestCase
*
* Hibernate Session
*/
protected void setUp(){
try {
/**
* hibernate.properties
* Configuration config = new Configuration();
* config.addClass(TUser.class);
*/
//hibernate.cfg.xml
//Configuration
// 1.Configuration
// 2.xmlMappingHard Coding
// POJO
Configuration config = new Configuration().configure();
SessionFactory sessionFactory =
config.buildSessionFactory();
session = sessionFactory.openSession();
} catch (HibernateException e) {
e.printStackTrace();
}
}

/**

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

* setUpJUnit TestCasetearDown
*
* setUpHibernate Session
*/
protected void tearDown(){
try {
session.close();
} catch (HibernateException e) {
e.printStackTrace();
}
}
/**
* Insert
*
* JUnittestJUnit
*
*/
public void testInsert(){
try {
TUser user = new TUser();
user.setName("Emma");
session.save(user);
session.flush();
} catch (HibernateException e) {
e.printStackTrace();
Assert.fail(e.getMessage());
}
}
/**
* Select
* name=Erica
*/
public void testSelect(){
String hql=
" from TUser where name='Erica'";
try {
List userList = session.find(hql);
TUser user =(TUser)userList.get(0);
Assert.assertEquals(user.getName(),"Erica");

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

} catch (HibernateException e) {
e.printStackTrace();
Assert.fail(e.getMessage());
}
}
}

IDE EclipseIntellij IDEA JBuilder JUnit Eclipse


Run Run as -> JUnit Test

TUser
Java Hibernate

JDBC

Hibernate
1 Configuration
2 SessionFactory
3 Session

Hibernate
Configuration
Configuration Hibernate Hibernate

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

1 URL
2
3
4 JDBC
5 dialect
Hibernate
Hibernate
hibernate hibernate.cfg.xml hibernate.properties
Hibernate

Configuration config = new Configuration().configure();


Hibernate CLASSPATH hibernate.cfg.xml
Configuration SessionFactory
SessionFactory Hibernate
SessionFactory
hibernate.cfg.xml

File file = new File("c:\\sample\\myhibernate.xml");


Configuration config = new Configuration().configure(file);

SessionFactory
SessionFactory Session Configuation
SessionFactory
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();

Configuration config SessionFactory


SessionFactory config
SessionFactory sessionFactory

config SessionFactory config


SessionFactory
Session
Session JDBC Connection
Session SessionFactory

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Configuration config = new Configuration().configure();


SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();

Session savefindflush
Find:
String hql= " from TUser where name='Erica'";
List userList = session.find(hql);
Save:

TUser user = new TUser();


user.setName("Emma");
session.save(user);
session.flush();

Session.flushHibernateuser
flush
hibernateflushSessionflush

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Hibernate
XDoclet Hibernate
POJO XDoclet

XDoclet Hibernate
MiddleGen hbm2java XDoclet tag POJO
MiddleGen build.xml genXDocletTags XDoclet Tag
Hibernate Quick Start MiddleGen

POJO XDoclet
tag
XDoclet EJB Hibernate
Hibernate Doclet Hibernate ant
java doc tag
XDoclet Java JavaDoc tag
XDoclet JavaDoc Tag
XDoclet
Hibernate-Doclet Hibernate JavaDoc tag
Hibernate
Hibernate-Doclet
/**
* @hibernate.class
*

table="TUser"

*/
public class TUser implements Serializable {

/**
* @hibernate.property
*

column="name"

length="50"

not-null="true"

*
* @return String
*/
public String getName() {
return this.name;

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Hibernate-Doclet POJOTUserTUser

hibernate doclet tag@hibernate.class @hibernate.property


tag POJO

Hibernate Doclet

<hibernate-mapping>
<class
name="net.xiaxin.xdoclet.TUser"
table="TUser"
>
<property
name="name"
type="java.lang.String"
column="name"
not-null="true"
length="50"
>
</class>
</hibernate-mapping>

Java Hibernate

Hibernate-Doclet Tag IDE


Live Template Hibernate-Doclet Tag

IDE JBuilderIntellij IDEAEclipse Hibernate-Doclet

Hibernate Doclet Tag Tag


XDoclet http://xdoclet.sourceforge.net/xdoclet/tags/hibernate-tags.html
Hibernate Referencehttp://www.hibernate.org

Hibernate-Doclet Tag
1. Class
1) @hibernate.class

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

POJO

table

Text

Bool

Bool

Text

dynamic-update

Update SQL

: false

dynamic-insert

Insert SQL (null)

false

Proxy

discriminator-value

Text

where

Text

where=location=Shanghai"

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

/**
* @hibernate.class
*

table="TUser"

(1)

dynamic-update="true"

(2)

dynamic-insert="true"

(3)

proxy=

(4)

discriminator-value=1

(5)

*/
public class TUser implements Serializable {

}
:
1

table TUserTUser

dynamic-update Update SQL


DB Update

Dynamic-insert Insert SQL


DB Insert

Proxy Proxy Lazy


Loading Lazy Loading

discriminator-value 1
discriminator-value
@hibernate.discriminator

2)

@hibernate.discriminator
@hibernate.discriminator

column

text

type

Hibernate

Bool

length

Bool

TUserTUserUserSysAdmin
SysOperator
TUser user_type

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Hibernateuser_typeClass user_type==1
SysAdminuser_type==2 SysOperator

Hibernate-Doclet
@hibernate.discriminator @hibernate.class @hibernate.subclass
discriminator-value

/**
*
* @hibernate.class
*

table="TUser"

dynamic-update="true"

dynamic-insert="true"

*
* @hibernate.discriminator column="user_type" type="integer"
*/
public class TUser implements Serializable {

TUser @hibernate.discriminator "user_type"

/**
* @hibernate.subclass
*

discriminator-value="1"

*/
public class SysAdmin extends TUser {

/**
* @hibernate.subclass
*

discriminator-value="2"

*/
public class SysOperator extends TUser {

SysAdmin SysOperator TUser discriminator-value


"1""2" Hibernate t_user user_type
1 SysAdmin 2 SysOperator
SysAdmin SysOperator Tag

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

@hibernate.subclass@hibernate.subclass @hibernate.class

@hibernate.subclass Tag

2.

Method
1)

@hibernate.id
POJO

column

Text

Text

type

Hibernate
int Integer
id [ int]

Hibernate

length

Text

unsaved-value

Text

Text

generator-class

Hibernate Quick
Start MiddleGen

assigned
hilo
seqhilo
increment
identity
sequence
native
uuid.hex
uuid.string
foreign

2)

@hibernate.property

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

POJO

column

Text

type

Text

length

Text

not-null

Bool

unique

Bool

insert

Insert

Bool

Bool

true
Update

update

true

/**
* @hibernate.property
*

column="name"

length="50"

not-null="true"

*
* @return String
*/
public String getName() {
return this.name;
}
POJOgetter/setterpublic
privateHibernate
1.4Sun JDKIBM JDK

XDoclet Tagxdoclet
xdocletanthibernate xdocletant
CLASSPATH
<?xml version="1.0"?>
<project name="Hibernate" default="hibernate" basedir=".">
<property name="xdoclet.lib.home"

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

value="C:\xdoclet-1.2.1\lib"/>
<target name="hibernate" depends=""
description="Generates Hibernate class descriptor files.">
<taskdef name="hibernatedoclet"
classname="xdoclet.modules.hibernate.HibernateDocletTask">
<classpath>
<fileset dir="${xdoclet.lib.home}">
<include name="*.jar"/>
</fileset>
</classpath>
</taskdef>
<hibernatedoclet
destdir="./src/"
excludedtags="@version,@author,@todo"
force="true"
verbose="true"
mergedir=".">
<fileset dir="./src/">
<include name="**/hibernate/sample/*.java"/>
</fileset>
<hibernate version="2.0"/>
</hibernatedoclet>
</target>
</project>

Hibernate Doclet Tag


Class
@hibernate.cache
@hibernate.jcs-cache
@hibernate.joined-subclass
@hibernate.joined-subclass-key
@hibernate.query

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Method
@hibernate.array
@hibernate.bag
@hibernate.collection-cache
@hibernate.collection-composite-element
@hibernate.collection-element
@hibernate.collection-index
@hibernate.collection-jcs-cache
@hibernate.collection-key
@hibernate.collection-key-column
@hibernate.collection-many-to-many
@hibernate.collection-one-to-many
@hibernate.column
@hibernate.component
@hibernate.generator-param
@hibernate.index-many-to-many
@hibernate.list
@hibernate.many-to-one
@hibernate.map
@hibernate.one-to-one
@hibernate.primitive-array
@hibernate.set
@hibernate.timestamp
@hibernate.version
TagXDocletTag1Hibernate
Tag

http://xdoclet.sourceforge.net/xdoclet/tags/hibernate-tags.html

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Hibernate ORM Hibernate

1. Criteria Query
2. Hibernate Query Language (HQL)
3. SQL

Criteria Query
Criteria Query
Criteria Query SQL
Criteria criteria = session.createCriteria(TUser.class);
criteria.add(Expression.eq("name","Erica"));
criteria.add(Expression.eq("sex",new Integer(1)));
criteria SQL Select * from t_user where
name=Erica and sex=1 Hibernate show_sql
Hibernate SQL
Hibernate Criteria
criteria.add SQL
Java
ORM Apache OJB
Hibernate SQL Criteria Query
HQLCriteria Query
IDE Coding Assist Criteria

Criteria
Criteria Criteria.add
Criteria
Expression SQL
Expression

Expression.eq

SQLfield = value
Expression.eq("name","Erica")

Expression.allEq

Map

Expression.eq

Expression.gt

September 2, 2004

SQL field > value

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Expression.ge

SQL field >= value

Expression.lt

SQL field < value

Expression.le

SQL field <= value

Expression.between

SQL between
age 13 50

Expression.between("age",new
Integer(13),new Integer(50));

Expression.like

SQL field like value

Expression.in

SQL field in

Expression.eqProperty

SQL field
= field

Expression.eqProperty(
"TUser.groupID",
"TGroup.id"
);

Expression.gtProperty

SQL field
> field

Expression.geProperty

SQL field
>= field

Expression.ltProperty

SQL field
< field

Expression.leProperty

SQL field
<= field

Expression.and

and

Expression.and(
Expression.eq("name","Erica"),
Expression.eq(
"sex",
new Integer(1)
)
);

Expression.or

or

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Expression.or(
Expression.eq("name","Erica"),
Expression.eq("name","Emma")
);
Expression.sql

SQL
SQL

Erica
Expression.sql(
lower({alias}.name) like lower(?),
"Erica%",
Hibernate.STRING
);
{alias} Hibernate
POJO

Expression Express.eq
POJO

Criteria

criteria. setFirstResult/setMaxResults
:
Criteria criteria = session.createCriteria(TUser.class);
//20
criteria.setFirstResult(100);
criteria.setMaxResults(20);

//groupId=2
//()groupId
Criteria criteria = session.createCriteria(TUser.class);
criteria.add(Expression.eq("groupId",new Integer(2)));
criteria.addOrder(Order.asc("name"));

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

criteria.addOrder(Order.desc("groupId"));

Criteria Hibernate
HQL Criteria OJB
Criteria Hibernate
HQL

Hibernate Query Language (HQL)


Criteria HQLHibernate
Query Language HQL

CriteriaHQL SQL

String hql = "from org.hibernate.sample.TUser";


Query query = session.createQuery(hql);
List userList = query.list();
TUser
Erica SQL SQL

String hql =
"from org.hibernate.sample.TUser as user where user.name='Erica'";
Query query = session.createQuery(hql);
List userList = query.list();
aswhereas where

HQL
HQL Hibernate
Hibernate Chapter 11

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Hibernate one-to-one
Erica
System Admin

TUser TGroup
one-to-one TUser TGroup
one-to-one
TUser TGroup TUser
TUser TUser.hbm.xml one-to-one
TGroup
<hibernate-mapping>
<class
name="org.hibernate.sample.TUser"
table="t_user"
dynamic-update="true"
dynamic-insert="true"
>

<one-to-one
name="group"
class="org.hibernate.sample.TGroup"
cascade="none"
outer-join="auto"
constrained="false"
/>

</class>
</hibernate-mapping>
XDoclet Tag
/**
* @hibernate.class
*

table="t_user"

dynamic-update="true"

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

dynamic-insert="true"

*
*/
public class TUser implements Serializable {

private TGroup group;


/**
* @hibernate.one-to-one
*

name="group"

cascade="none"

class="org.hibernate.sample.TGroup"

outer-join="auto"

* @return
*/
public TGroup getGroup() {
return group;
}

}
one-to-one

name

Text

class

Text

Text

Package name

cascade

cascade

all :
none
save-update: save-update

delete delete
cascade Hibernate

save-update delete

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

save-update delete

TUser
TGroup

none
constrained

Bool

Text

Text

Text

foreign key
savedelete

outer-join

true outer-join
false outer-join
auto()
Proxy outer-join.
property-ref

access

field
property
ClassName


TUser(TAddress)

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

TUser
TUser.hbm.xml:
<hibernate-mapping>
<class
name="org.hibernate.sample.TUser"
table="t_user"
dynamic-update="true"
dynamic-insert="true"
>

<set
name="addresses"
table="t_address"
lazy="false"
inverse="false"
cascade="all"
sort="unsorted"
order-by="zipcode asc"
>
<key
column="user_id"
>
</key>
<one-to-many
class="org.hibernate.sample.TAddress"
/>
</set>

</class>
</hibernate-mapping>
XDoclet Tag :
/**
* @hibernate.collection-one-to-many
*

class="org.hibernate.sample.TAddress"

*
* @hibernate.collection-key column="user_id"
*
* @hibernate.set

September 2, 2004

So many open source projects. Why not Open your Documents?

Version 1.0

Hibernate Developers Guide

name="addresses"

table="t_address"

inverse="false"

cascade="all"

lazy="false"

sort=unsorted

order-by="zipcode asc"

Version 1.0

*
*/
public Set getAddresses() {
return addresses;
}
Taddress Hibernate
Collection
one-to-many java.util.Set
net.sf.hibernate.collection.Bag Collection XML
<set></set><bag></bag> Hibernate Collection
Hibernate Reference.
one-to-many

name

Text

table

Text

lazy

Text

Bool

Text

Text

inverse

inverse=false

false

cascade

cascade

all :
none
save-update: save-update

delete delete

sort

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

unsorted
natural order-by

comparatorClass
java.util.Comparator

order-by

Text

Text

Text

Int

Text

JDK1.4
SQL order by
sort natural

where

outer-join

true outer-join
false outer-join
auto()
Proxy outer-join.

batch-size

Lazy Loading

access

field
property
ClassName

NOT NULLHibernate

Erica
Transaction tx = session.beginTransaction();
TAddress addr = new TAddress();

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

addr.setTel("1123");
addr.setZipcode("233123");
addr.setAddress("Hongkong");
user.getAddresses().add(addr);
session.save(user);//
tx.commit();
HibernateSQLt_address
:
1.

save(user)
insert into t_address (user_id, address, zipcode, tel)
values (null, "Hongkong", "233123", "1123")

2.

tx.commit()
update t_address set user_id=1, address="Hongkong",
zipcode="233123", tel="1123" where id=2

SQL
SQLt_addressuser_iduserid
t_address.user_idNOT NULL
Hibernatet_addressuser_id
null

net.sf.hibernate.PropertyValueException: not-null property


references a null or transient value:
org.hibernate.sample.TAddress.userId

TUseraddr
TUseraddruser_id

addrTUser
idaddr.user_idaddr
hibernateupdate sql

TUserTAddress
InsertHadont ask me ,go to ask
Hibernate TeamJ

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

NULL

user_id
hibernateUpdate
user_id
TAddress.hbm.xmlHibernateinsert
update
one-to-many
user_idTAddress.hbm.xml
HibernateSQL:
1.
insert into t_address (address, zipcode, tel) values
('Hongkong', '233123', '1123')
2.

update t_address set user_id=1 where id=7

insertuser_id

idupdateuser_id
HibernateSQL
insert

addruser_id
insert
Update

TAddressTUser

t_address
TUser.hbm.xml:
<hibernate-mapping>

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

<class
name="org.hibernate.sample.TUser"
table="t_user"
dynamic-update="true"
dynamic-insert="true"
>

<set
name="addresses"
table="t_address"
lazy="false"
inverse="true"
cascade="all"

sort="unsorted"
order-by="zipcode asc"
>
<key
column="user_id"
>
</key>
<one-to-many
class="org.hibernate.sample.TAddress"
/>
</set>
</class>
</hibernate-mapping>
inverse true TUser
org.hibernate.sample.TAddress
TAddress TUser id
user_id insert
one-to-many many inverse=false

J
xdoclet tag
public class TUser implements Serializable {

private Set addresses = new HashSet();

/**

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

* @hibernate.collection-one-to-many
*

class="org.hibernate.sample.TAddress"

*
* @hibernate.collection-key column="user_id"
*
* @hibernate.set
*

name="addresses"

table="t_address"

inverse="true"

lazy="false"

cascade=all

sort="unsorted"

order-by="zipcode asc"

*/
public Set getAddresses() {
return addresses;
}

}
TAddress.hbm.xml:
<hibernate-mapping>
<class
name="org.hibernate.sample.TAddress"
table="t_address"
dynamic-update="false"
dynamic-insert="false"
>

<many-to-one
name="user"
class="org.hibernate.sample.TUser"

cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="user_id"
not-null="true"
/>
</class>
</hibernate-mapping>
TAddress TUser field user

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

getter/setter user_id
Repeated column in mapping
Xdoclet tag:
public class TAddress implements Serializable {

private TUser user;

/**
* @hibernate.many-to-one
*

name="user"

column="user_id"

not-null="true"
*
*/

public TUser getUser() {


return this.user;
}

Criteria criteria = session.createCriteria(TUser.class);


criteria.add(Expression.eq("name","Erica"));
List userList = criteria.list();
TUser user =(TUser)userList.get(0);
Transaction tx = session.beginTransaction();
TAddress addr = new TAddress();
addr.setTel("1123");
addr.setZipcode("233123");
addr.setAddress("Hongkong");
user.getAddresses().add(addr);
session.save(user);//
tx.commit();

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

TAddress many-to-one

inverse TUser inverse


true TAddress
TUser TAddress user_id
TAddress user_id

TAddress addr = new TAddress();


addr.setTel("1123");
addr.setZipcode("233123");
addr.setAddress("Hongkong");
addr.setUser(user);//TUser
user.getAddresses().add(addr);
session.save(user);//

Hibernate SQL
insert into t_address (user_id, address, zipcode, tel) values
(1, 'Hongkong', '233123', '1123')
Insert
many-to-one

name

Text

column

Text

class

Text

Text

Bool

cascade

cascade

all :
none
save-update: save-update

delete delete

update

September 2, 2004

Update

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

true
Insert

insert

Bool

Text

Text

Text

true

outer-join

true outer-join
false outer-join
auto()
Proxy outer-join.
property-ref

access

field
property
ClassName

Hibernate

Lazy Loading
Group Role
Role Privilege

Group

Role

Privilege

Group Role :

Group Role

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Role Group

TRole TPrivilege t_role


t_privilege
TGroup.hbm.xml
<hibernate-mapping>
<class
name="org.hibernate.sample.TGroup"
table="t_group"
dynamic-update="false"
dynamic-insert="false"
>

<set
name="roles"
table="t_group_role"
lazy="false"

inverse="false"
cascade="save-update"

>
<key
column="group_id"

>
</key>
<many-to-many
class="org.hibernate.sample.TRole"
column="role_id"

/>
</set>
</class>
</hibernate-mapping>
t_group t_role
cascade save-update

Group Role Role


Group Role Group

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

t_group
t_role
xdoclet tag
public class TGroup implements Serializable {

private Set roles = new HashSet();


/**
* @hibernate.set
*

name="roles"

table="t_group_role"

lazy="false"

inverse="false"

cascade="save-update"

sort=unsorted

*
* @hibernate.collection-key
*

column="group_id"

*
* @hibernate.collection-many-to-many
*

class="org.hibernate.sample.TRole"

column="role_id"

*
*/
public Set getRoles() {
return roles;
}

TRole.hbm.xml
<hibernate-mapping>
<class
name="org.hibernate.sample.TRole"
table="t_role"
dynamic-update="false"
dynamic-insert="false"
>

<set

September 2, 2004

So many open source projects. Why not Open your Documents?

Version 1.0

Hibernate Developers Guide

name="groups"
table="t_group_role"
lazy="false"
inverse="true"
cascade="save-update"
sort="unsorted"
>
<key
column="role_id"
>
</key>
<many-to-many
class="org.hibernate.sample.TGroup"
column="group_id"
outer-join="auto"
/>
</set>
</class>
</hibernate-mapping>
xdoclet
public class TRole implements Serializable {
private Set groups = new HashSet();

/**
*
* @hibernate.set
*

name="groups"

table="t_group_role"

cascade="save-update"

inverse="true"

lazy="false"

*
* @hibernate.collection-key
*

column="role_id"

*
* @hibernate.collection-many-to-many
*

class="org.hibernate.sample.TGroup"

column="group_id"

*
*

September 2, 2004

So many open source projects. Why not Open your Documents?

Version 1.0

Hibernate Developers Guide

Version 1.0

*/
public Set getGroups() {
return groups;
}
}

many-to-many

column

Text

class

Text

Text

outer-join

true outer-join
false outer-join
auto()
Proxy outer-join.

public void testPersist(){


TRole role1 = new TRole();
role1.setName("Role1");
TRole role2 = new TRole();
role2.setName("Role2");
TRole role3 = new TRole();
role3.setName("Role3");
TGroup group1 = new TGroup();
group1.setName("group1");
TGroup group2 = new TGroup();
group2.setName("group2");

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

TGroup group3 = new TGroup();


group3.setName("group3");
group1.getRoles().add(role1);
group1.getRoles().add(role2);
group2.getRoles().add(role2);
group2.getRoles().add(role3);
group3.getRoles().add(role1);
group3.getRoles().add(role3);
role1.getGroups().add(group1);
role1.getGroups().add(group3);
role2.getGroups().add(group1);
role2.getGroups().add(group2);
role3.getGroups().add(group2);
role3.getGroups().add(group3);

try {
Transaction tx = session.beginTransaction();
//
session.save(role1);
session.save(role2);
session.save(role3);
session.save(group1);
session.save(group2);
session.save(group3);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
Assert.fail(e.getMessage());
}
}

September 2, 2004

So many open source projects. Why not Open your Documents?

Version 1.0

Hibernate Developers Guide

Version 1.0

3 TGroup 3 TRole

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

PO VO
PO Persistence Object
VO Value Object
PO VO Hibernate
VOVO

TUser user = new TUser();


user.setName("Emma");
user VOVO
PO? Hibernate VO
TUser user = new TUser();
TUser anotherUser = new TUser();
user.setName("Emma");
anotherUser.setName("Kevin");
//useranotherUserVO
Transaction tx = session.beginTransaction();
session.save(user);
//userHibernatePO
//anotherUserVO
tx.commit();
//Emma
//anotherUser
Transaction tx = session.beginTransaction();
user.setName("Emma_1"); //PO
anotherUser.setName("Kevin_1");//VO
tx.commit();
//PO
//EmmaEmma_1
//anotherUserJava
//

September 2, 2004

So many open source projects. Why not Open your Documents?

Version 1.0

Hibernate Developers Guide

Version 1.0

HibernatePO:
//HibernatePO
TUser user = (TUser)session.load(TUser.class,new Integer(1));
VOHibernatePO
session.save(user)VO user
HibernateSession.savesaveHibernate

1 sessionEntity Mapuser

2 useridsave.
HibernateSessionMap
hibernate
Session
saveSessionSession
Session.flush
Hibernate
update
3 insert
a) nativeidhibernate
insertiduserid
b) userHibernate
c) saveid.

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Session.loadHibernate

VOPO

VOJava Object

POHibernateEntity Map
HibernatePO

POSessionSessionPO
VO
POVOMVC
ModelPOPO
POViewModel

PO
VOPO
VOData Transfer ObjectDTOVO

Apache Jakarta Commons Beanutils


http://jakarta.apache.org/commons/beanutils/
get/set
useranotherUser
TUser user = new TUser();
TUser anotherUser = new TUser();
user.setName("Emma");
user.setUserType(1);
try {
BeanUtils.copyProperties(anotherUser,user);
System.out.println("UserName => "
+anotherUser.getName()
);
System.out.println("UserType => "
+ anotherUser.getUserType()
);

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}

unsaved-value
Hibernate
session saveupdatesaveOrupdate

session.save(user);
Hibernate Cascade
Hibernate
Hibernate unsaved-value
Hibernate id
unsaved-value

user hibernate user


address user address
session.save(user)
hibernate unsaved-value user address
save
address idInteger
null unsaved-valuenull hibernate
insert
user
address address user

id
unsaved-valuenull Hibernate
POVO

insert
update
Session VO
PO POVO
saveSessionSession

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Session.flushHibernate
update

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Inverse Cascade
Inverse Hibernate Inverse

inverse=false

Cascade TUser Cascade all


user user
user save user address save
inverse cascadeInverse
cascade

Lazy Loading
Hibernate

useraddress
address
usersexuseraddress
addressuser

useruser
useraddressuser.getAddresses
address
lazytrue
<hibernate-mapping>
<class
name="org.hibernate.sample.TUser"
table="t_user"
dynamic-update="true"
dynamic-insert="true"
>

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

<set
name="addresses"
table="t_address"
lazy="true"
inverse="false"

cascade="all"
sort="unsorted"
order-by="zipcode asc"
>
<key
column="user_id"
>
</key>
<one-to-many
class="org.hibernate.sample.TAddress"
/>
</set>

</class>
</hibernate-mapping>

Criteria criteria = session.createCriteria(TUser.class);


criteria.add(Expression.eq("name","Erica"));
List userList = criteria.list();
TUser user =(TUser)userList.get(0);
System.out.println("User name => "+user.getName());
Set hset = user.getAddresses();
session.close();//Session

TAddress addr = (TAddress)hset.toArray()[0];


System.out.println(addr.getAddress());

LazyInitializationException - Failed to lazily initialize a

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

collection - no session or session was closed


session.close
useraddressHibernate
sessionaddress
sessionsession

Sessionuseraddresses
ViewUser
addressUserSession
Hibernate.initialize
Hibernate.initialize(user.getAddresses());
session.close();
//Hibernate.initialize
//addressessession
Set hset= user.getAddresses();
TAddress addr = (TAddress)hset.toArray()[0];
System.out.println(addr.getAddress());

hibernateJDK
Collection
HashSetHibernateSet
Set hset = (HashSet)user.getAddresses();
java.lang.ClassCastException,
HibernateSetnet.sf.hibernate.collection.Set
JDK Set
POJOJDK CollectionSet,Map,
JDK CollectionHashSetHashMapCollection

TUser
public class TUser implements Serializable {

private Set addresses = new HashSet();

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

}
SetaddressesHashSet
addressesTUseraddress

TUser user = new TUser();


TAddress addr = new TAddress();
addr.setAddress("Hongkong");
user.getAddresses().add(addr);
session.save(user);
addressesHashSetaddress
session.save(user)HibernateHashSet

EclipseDebugsession.saveuser

session.saveuser

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

session.saveuser
userHibernate
insertHibernateid
nativeuserid
HibernateCollection
net.sf.hibernate.collection.SetuserHashSetaddresses
addressesaddresses

CollectionHibernateCollection
Collection

Hibernate JDBC
Hibernate JDBC JTA
Hibernate JDBC Transaction
JTA
<hibernate-configuration>
<session-factory>

<property name="hibernate.transaction.factory_class">
net.sf.hibernate.transaction.JTATransactionFactory
<!--net.sf.hibernate.transaction.JDBCTransactionFactory-->
</property>

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

</session-factory>
</hibernate-configuration>
JDBC
JDBC Hibernate JDBC

session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

tx.commit();
JDBC
Connection dbconn = getConnection();
dbconn.setAutoCommit(false);

dbconn.commit();
Hibernate
JDBC
sessionFactory.openSession()hibernate
AutoCommit false
Session.beginTransaction Hibernate Connection
AutoCommit session
Connection.AutoCommit
SessionFactory session
AutoCommit=false
session = sessionFactory.openSession();
session.save(user);
session.close();
JDBC Connection AutoCommit false
JDBC commit Connection
Transaction
session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.save(user);
tx.commit();
session.close();

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

JTA
JTA Session JDBC Transaction

JDBC Connnection
JDBC Connection

Connection JDBC Transaction


Hibernate Session JDBC Connection
Session
JTA JTA JTA Connection
JTA JDBC Connection
JTA Hibernate JTA Session

JDBC Connection Hibernate Session


JDBC Connection
JTA JTA Container
Connection JTA Transaction
Hibernate Transaction
JDBC Transaction
public class ClassA{
public void saveUser(User user){
session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.save(user);
tx.commit();

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

session.close();
}
}
public class ClassB{
public void saveOrder(Order order){
session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.save(order);
tx.commit();
session.close();
}
}
public class ClassC{
public void save(){

UserTransaction tx = new InitialContext().lookup();


ClassA.save(user);
ClassB.save(order);
tx.commit();

}
}

ClassA ClassBsaveUser saveOrder


ClassC ClassA.saveUser
ClassB.saveOrder JTA UserTransaction
ClassC.save
ClassA ClassB Hibernate Transaction
Hibernate JTA Session.beginTransaction
InitialContext.lookup UserTransaction Transaction.commit
UserTransaction.commit
JTA TransactionClassC ClassC ClassA
ClassB
JTA Transaction Hibernate
Transaction
public class ClassA{

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

public void save(TUser user){


session = sessionFactory.openSession();
session.save(user);
session.close();
}

}
public class ClassB{
public void save (Order order){
session = sessionFactory.openSession();
session.save(order);
session.close();
}

}
public class ClassC{
public void save(){

UserTransaction tx = new InitialContext().lookup();


classA.save(user);
classB.save(order);
tx.commit();

}
}

ClassC.save
public class ClassC{
public void save(){

session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
classA.save(user);
classB.save(order);
tx.commit();

}
}

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Hibernate UserTransaction
InitialContext UserTransaction

EJB JTA Transaction save


JTA Session Bean save
RequiredEJB
/**
* @ejb.interface-method
*

view-type="remote"

*
* @ejb.transaction type = "Required"
**/
public void save(){
//EJB
classA.save(user);
classB.save(log);
}//EJB
locking

cut-off

Hibernate Pessimistic Locking


Optimistic Locking
Pessimistic Locking

select * from account where name=Erica for update


sql account name=Erica

Hibernate

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

String hqlStr =
"from TUser as user where user.name='Erica'";
Query query = session.createQuery(hqlStr);
query.setLockMode("user",LockMode.UPGRADE); //
List userList = query.list();//
query.setLockMode
TUser user user
Hibernate SQL
select tuser0_.id as id, tuser0_.name as name, tuser0_.group_id
as group_id, tuser0_.user_type as user_type, tuser0_.sex as sex
from t_user tuser0_ where (tuser0_.name='Erica' ) for update
Hibernate for update
Hibernate

LockMode.NONE

LockMode.WRITE Hibernate Insert Update

LockMode.READ Hibernate

Hibernate Hibernate Update


save WRITE

LockMode.UPGRADE for update

LockMode. UPGRADE_NOWAIT Oracle Oracle for


update nowait

Criteria.setLockMode
Query.setLockMode
Session.lock
Hiberate SQL
for update
Select SQL
Optimistic Locking

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0


Version
version

version 1balance$100
1

A version=1 $50
$100-$50

A B version=1
$20$100-$20

A version=2
balance=$50
version 2

B version=2
balance=$80 B
2 2
B
B version=1
A

A
B

Hibernate
Hibernate

Hibernate class optimistic-lock version

TUser

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

1 TUser class optimistic-lock


<hibernate-mapping>
<class
name="org.hibernate.sample.TUser"
table="t_user"
dynamic-update="true"
dynamic-insert="true"
optimistic-lock="version"
>

</class>
</hibernate-mapping>
optimistic-lock

none

version

dirty

all

version Hibernate
Hibernate Session
version Hibernate
2 Version
<hibernate-mapping>
<class
name="org.hibernate.sample.TUser"
table="t_user"
dynamic-update="true"
dynamic-insert="true"
optimistic-lock="version"
>
<id
name="id"
column="id"
type="java.lang.Integer"
>
<generator class="native">

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

</generator>
</id>
<version
column="version"
name="version"
type="java.lang.Integer"
/>

</class>
</hibernate-mapping>

version ID
version TUser
version
TUser
Criteria criteria = session.createCriteria(TUser.class);
criteria.add(Expression.eq("name","Erica"));
List userList = criteria.list();
TUser user =(TUser)userList.get(0);
Transaction tx = session.beginTransaction();
user.setUserType(1); //UserType
tx.commit();
TUser version
tx.commit Session Erica

Session session= getSession();


Criteria criteria = session.createCriteria(TUser.class);
criteria.add(Expression.eq("name","Erica"));
Session session2 = getSession();
Criteria criteria2 = session2.createCriteria(TUser.class);
criteria2.add(Expression.eq("name","Erica"));
List userList = criteria.list();
List userList2 = criteria2.list();

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

TUser user =(TUser)userList.get(0);


TUser user2 =(TUser)userList2.get(0);
Transaction tx = session.beginTransaction();
Transaction tx2 = session2.beginTransaction();
user2.setUserType(99);
tx2.commit();
user.setUserType(1);
tx.commit();
tx.commit() StaleObjectStateException

Hibernate
JDBC

Hibernate

Criteria.setFirstResult Criteria.setFetchSize

Criteria criteria = session.createCriteria(TUser.class);


criteria.add(Expression.eq("age","20"));
//10020
criteria.setFirstResult(100);
criteria.setFetchSize(20);
Query
Hibernate net.sf.hibernate.dialect
dialect

dialect
Public String getLimitString(
String querySelect,

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

boolean hasOffset
)
Select
MySQL Limit Oracle rownum

MySQLDialect getLimitString
public String getLimitString(String sql, boolean hasOffset) {
return new StringBuffer( sql.length()+20 )
.append(sql)
.append( hasOffset ? " limit ?, ?" : " limit ?")
.toString();
}
MySQLDialect.getLimitString
Select MySQL SQL limit
Oracle9Dialect getLimitString Oracle
rownum
public String getLimitString(String sql, boolean hasOffset)
{
StringBuffer pagingSelect =
new StringBuffer( sql.length()+100 );
if (hasOffset) {
pagingSelect.append(
"select * from ( select row_.*, rownum rownum_ from ( "
);
}else {
pagingSelect.append("select * from ( ");
}
pagingSelect.append(sql);
if (hasOffset) {
pagingSelect.append(
" ) row_ where rownum <= ?) where rownum_ > ?"
);
}else {
pagingSelect.append(" ) where rownum <= ?");
}
return pagingSelect.toString();
}

Hibernate Scrollable ResultSet


JDBC Scrollable ResultSetHibernate ResultSet
next Hibernate

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Cache
Cache DOS SmartDrv2

95 Windowns 3.0 SmartDrv


15 SmartDrv 2

Cache 114

Cache

.
Cache

Hibernate Cache Hibernate Cache

Hibernate
Cache
Hibernate Cache
Hibernate JVM
Hibernate Hibernate

Hibernate

Hibernate

Hibernate Cache
Hibernate JDBC
JDBC Hibernate

Java Cache HashTablehibernate


Hashtable Cache
Hibernate Cache JCSEHCache
OSCacheJBoss CacheSwarmCache
Hibernate Cache Cache Session
Cache Cache
2

DOS

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Cache Hibernate

Hibernate JCSJava Caching System Apache Turbine


Cache JCS
Hibernate
JCS EHCache Cache
JCSEHCache

Cache JCSJBossCache

Hibernate Cache Cache


Cache
Hibernate Cache

HashTable

net.sf.hibernate.cache.HashtableCacheP

rovider

EHCache

net.sf.ehcache.hibernate.Provider

OSCache

net.sf.hibernate.cache.OSCacheProvider

SwarmCache

net.sf.hibernate.cache.SwarmCachePro

vider
net.sf.hibernate.cache.TreeCacheProvid

JBossCache

er
SwarmCache JBossCache Cache
( OSCache )
SwarmCache invalidation

JBossCache Reapplication

Cache
hibernate.cfg.xml
EHCache

<hibernate-configuration>
<session-factory>

<property name="hibernate.cache.provider_class">
net.sf.ehcache.hibernate.Provider
</property>

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

</session-factory>
</hibernate-configuration>
Cache EHCache
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"

//Cache

eternal="false"

//Cache

timeToIdleSeconds="120"

//

timeToLiveSeconds="120"

//

overflowToDisk="true"
/>

//

</ehcache>
//

Cache
<class name=" org.hibernate.sample.TUser" .... >
<cache usage="read-write"/>
....
<set name="addresses" .... >
<cache usage="read-only"/>
....
</set>
</class>
cache
Class cache TUser
read-write TUser addresses

cache usage
1 read-only

2 read-write

3 nonstrict-read-write

4 transactional
cache Cache Cache

Hibernate Cache JBossCache

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Cache
Cache usage

read-only

read-write

nonstrict-read-write

HashTable

EHCache

OSCache

SwarmCache

JBossCache

transactional

Cache Hibernate Cache


PO Cache Cache
Cache
Hibernate

Query.list();
Query.iterate();
list Hibernate Select SQL
POJO
iterate Select SQL
id id Select SQL id
POJO
list SQL iterate n+1
SQL
iterate
list
Cache list Cache
iterate
id Cache hibernate
id Cache
Cache

Hibernate Cache Cache

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Cache

Session
Session Hibernate Hibernate Session
JDBC Connection

Session JDBC JDBC Connection


Session , Hibernate
Session Session
JVM
Session ThreadLocal ThreadLocal
Java ThreadLocal
JVM

SessionFactory SessionSessionFactory
SessionFactory Session
Session Session
Session Servlet
session Session
public class TestServlet extends HttpServlet {
private Session session;
public void doGet( HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
session = getSession();
doSomething();
session.flush();
}
public void doSomething(){
......//session
}
}

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Servlet Servlet
TestServlet Tomcat
doGet
doGet TestServlet
session A session
A session session
session
ThreadLocal

public class TestServlet extends HttpServlet {


private ThreadLocal localSession = new ThreadLocal();
public void doGet( HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
localSession.set(getSession());
doSomething();
session.flush();
}
public void doSomething(){
Session session = (Session)localSession.get();
......//session
}
}
localSession ThreadLocal doGet
set session doSomething get
session
ThreadLocal
JVM Map Map key value
ThreadLocal.set ThreadLocal.get
ThreadLocal Map
ThreadLocal

ThreadLocal A session A
session

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Session
Hibernate ThreadLocal Session

public class HibernateUtil {


private static SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory
sessionFactory = new
Configuration().configure().buildSessionFactory();
} catch (HibernateException ex) {
throw new RuntimeException(
"Configuration problem: " + ex.getMessage(),
ex
);
}
}
public static final ThreadLocal session = new ThreadLocal();
public static Session currentSession() throws HibernateException
{
Session s = (Session) session.get();
// Open a new Session, if this Thread has none yet
if (s == null) {
s = sessionFactory.openSession();
session.set(s);
}
return s;
}
public static void closeSession() throws HibernateException {
Session s = (Session) session.get();
session.set(null);
if (s != null)
s.close();
}
}
Session
Session Session
Session

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Hibernate Session

Session
HibernateUtil Java Web
Servlet2.3 Filter
Session Filter Servlet2.3
Filter Servlet
JSP Servlet
Filter Servlet Servlet
Filter Session Web Filter
Session
public class PersistenceFilter implements Filter
{
protected static ThreadLocal hibernateHolder = new ThreadLocal();
public void doFilter(ServletRequest request, ServletResponse
response, FilterChain chain)
throws IOException, ServletException
{
hibernateHolder.set(getSession());
try
{

chain.doFilter(request, response);

}
finally
{
Session sess = (Session)hibernateHolder.get();
if (sess != null)
{
hibernateHolder.set(null);
try
{
sess.close();
}
catch (HibernateException ex) {
throw new ServletException(ex);
}
}
}
}

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

}
doFilter SessionFilter
Filter Servlet Session
Http Request Session
Session HttpSession
Session Session J

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Hibernate in Spring
HibernateSpringSpring Framework

Springhttp://www.xiaxin.net/Spring_Dev_Guide.rar
SpringSpring Framework

Spring
Hibernate
Hibernate-Context.xml:
<beans>
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>net.sourceforge.jtds.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:jtds:sqlserver://127.0.0.1:1433/Sample</value>
</property>
<property name="username">
<value>test</value>
</property>
<property name="password">
<value>changeit</value>
</property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate.LocalSessionFactoryBean"
>
<property name="dataSource">
<ref local="dataSource" />
</property>
<property name="mappingResources">
<list>
<value>net/xiaxin/dao/entity/User.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

<props>
<prop key="hibernate.dialect">
net.sf.hibernate.dialect.SQLServerDialect
</prop>
<prop key="hibernate.show_sql">
true
</prop>
</props>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate.HibernateTransactionMana
ger">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="userDAO" class="net.xiaxin.dao.UserDAO">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="userDAOProxy"
class="org.springframework.transaction.interceptor.TransactionPro
xyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="userDAO" />
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

</beans>

1
SessionFactory
HibernateSessionFactorySessionSpring
SessionFactoryHibernate.cfg.xml
SessionFactory
SessionFactorymappingResourceslist

hibernateProperties
Hibernate.cfg.xmlSessionFactory

HibernateTransactionManager
org.springframework.orm.hibernate.HibernateTransactionManag

er

Users
User.java:
/**
* @hibernate.class table="users"
*/
public class User {
public Integer id;
public String username;
public String password;
/**
* @hibernate.id
*

column="id"

type="java.lang.Integer"

generator-class="native"

*/
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

}
/**
* @hibernate.property column="password" length="50"
*/
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
/**
* @hibernate.property column="username" length="50"
*/
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}

xdoclet // xdoclet ant


task user.hbm.xml
user.hbm.xml
<hibernate-mapping>
<class
name="net.xiaxin.dao.entity.User"
table="users"
dynamic-update="false"
dynamic-insert="false"
>
<id
name="id"
column="id"
type="java.lang.Integer"
>
<generator class="native">
</generator>
</id>

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

<property
name="password"
type="java.lang.String"
update="true"
insert="true"
access="property"
column="password"
length="50"
/>
<property
name="username"
type="java.lang.String"
update="true"
insert="true"
access="property"
column="username"
length="50"
/>
</class>
</hibernate-mapping>

UserDAO.java:
public class UserDAO extends HibernateDaoSupport implements IUserDAO
{
public void insertUser(User user) {
getHibernateTemplate().saveOrUpdate(user);
}
}

Spring+Hibernate

UserDAOIUserDAO
HibernateDaoSupport
HibernateSupportHibernateTemplateSessionFactory
HibernateTemplateHibernate Session
HibernateTemplate.execute

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

HibernateTemplateSession
/try/catch/finally

Hibernate
Session session
try {
Configuration config = new Configuration().configure();
SessionFactory sessionFactory =
config.buildSessionFactory();
session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user = new User();
user.setName("erica");
user.setPassword("mypass");
session.save(user);
tx.commit();

} catch (HibernateException e) {
e.printStackTrace();
tx.rollback();
}finally{
session.close();
}

InputStream is = new FileInputStream("Hibernate-Context.xml");


XmlBeanFactory factory = new XmlBeanFactory(is);
IUserDAO userDAO = (IUserDAO)factory.getBean("userDAOProxy");
User user = new User();
user.setUsername("erica");
user.setPassword("mypass");
userDAO.insertUser(user);

September 2, 2004

So many open source projects. Why not Open your Documents?

Hibernate Developers Guide

Version 1.0

Hibernate ORM ORM

ORM Apache OJBOracle TopLinkIBatis


Jaxor
Hibernate

ibatis

Hibernate
EJB

September 2, 2004

So many open source projects. Why not Open your Documents?

You might also like