Professional Documents
Culture Documents
Hibernate
V1.0
xiaxin(at)gmail.com
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
Hibernate
2003
Hibernate
Hibernate
Hibernate
Hibernate Reference
Hibernate
Hibernate Reference Hibernate Release
http://www.redsaga.com Hibernate Reference
September 2, 2004
Version 1.0
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
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
Version 1.0
Hibernate .hbm.xml
Hibernate
1
2 ORM Java
ORM Java
3 Java Java
POJO
xdoclet
xdoclet POJO
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
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
September 2, 2004
Version 1.0
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
Version 1.0
September 2, 2004
Version 1.0
MiddleGen
Key Generator
1) Assigned
September 2, 2004
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
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
September 2, 2004
Version 1.0
Lifecyle
Validatable validate
Validatable validate
Class MiddleGen
MiddleGen
September 2, 2004
Version 1.0
Key
Property
Version optimistic locking
optimistic locking
September 2, 2004
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
Version 1.0
commons-logging-1.0.3.jar
MiddleGen Hibernate
MiddleGen Eclipse
Hibernate Plugin Plugin
September 2, 2004
Version 1.0
Hibernate
POJO Hibernate
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
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
Version 1.0
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
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
Version 1.0
} catch (HibernateException e) {
e.printStackTrace();
Assert.fail(e.getMessage());
}
}
}
TUser
Java Hibernate
JDBC
Hibernate
1 Configuration
2 SessionFactory
3 Session
Hibernate
Configuration
Configuration Hibernate Hibernate
September 2, 2004
Version 1.0
1 URL
2
3
4 JDBC
5 dialect
Hibernate
Hibernate
hibernate hibernate.cfg.xml hibernate.properties
Hibernate
SessionFactory
SessionFactory Session Configuation
SessionFactory
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
September 2, 2004
Version 1.0
Session savefindflush
Find:
String hql= " from TUser where name='Erica'";
List userList = session.find(hql);
Save:
Session.flushHibernateuser
flush
hibernateflushSessionflush
September 2, 2004
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
Version 1.0
Hibernate-Doclet POJOTUserTUser
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
1. Class
1) @hibernate.class
September 2, 2004
Version 1.0
POJO
table
Text
Bool
Bool
Text
dynamic-update
Update SQL
: false
dynamic-insert
false
Proxy
discriminator-value
Text
where
Text
where=location=Shanghai"
September 2, 2004
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
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
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 {
/**
* @hibernate.subclass
*
discriminator-value="1"
*/
public class SysAdmin extends TUser {
/**
* @hibernate.subclass
*
discriminator-value="2"
*/
public class SysOperator extends TUser {
September 2, 2004
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
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
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>
September 2, 2004
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
Version 1.0
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
Version 1.0
Expression.ge
Expression.lt
Expression.le
Expression.between
SQL between
age 13 50
Expression.between("age",new
Integer(13),new Integer(50));
Expression.like
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
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
Version 1.0
criteria.addOrder(Order.desc("groupId"));
Criteria Hibernate
HQL Criteria OJB
Criteria Hibernate
HQL
CriteriaHQL 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
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
Version 1.0
dynamic-insert="true"
*
*/
public class TUser implements Serializable {
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
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
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
Version 1.0
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
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
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
TUseraddr
TUseraddruser_id
addrTUser
idaddr.user_idaddr
hibernateupdate sql
TUserTAddress
InsertHadont ask me ,go to ask
Hibernate TeamJ
September 2, 2004
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.
insertuser_id
idupdateuser_id
HibernateSQL
insert
addruser_id
insert
Update
TAddressTUser
t_address
TUser.hbm.xml:
<hibernate-mapping>
September 2, 2004
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 {
/**
September 2, 2004
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
Version 1.0
getter/setter user_id
Repeated column in mapping
Xdoclet tag:
public class TAddress implements Serializable {
/**
* @hibernate.many-to-one
*
name="user"
column="user_id"
not-null="true"
*
*/
September 2, 2004
Version 1.0
TAddress many-to-one
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
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
Version 1.0
Role Group
<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
September 2, 2004
t_group
t_role
xdoclet tag
public class TGroup implements Serializable {
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
Version 1.0
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
Version 1.0
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.
September 2, 2004
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
Version 1.0
Version 1.0
3 TGroup 3 TRole
September 2, 2004
PO VO
PO Persistence Object
VO Value Object
PO VO Hibernate
VOVO
September 2, 2004
Version 1.0
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
Version 1.0
Session.loadHibernate
VOPO
VOJava Object
POHibernateEntity Map
HibernatePO
POSessionSessionPO
VO
POVOMVC
ModelPOPO
POViewModel
PO
VOPO
VOData Transfer ObjectDTOVO
September 2, 2004
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
id
unsaved-valuenull Hibernate
POVO
insert
update
Session VO
PO POVO
saveSessionSession
September 2, 2004
Version 1.0
Session.flushHibernate
update
September 2, 2004
Version 1.0
Inverse Cascade
Inverse Hibernate Inverse
inverse=false
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
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>
September 2, 2004
Version 1.0
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 {
September 2, 2004
Version 1.0
}
SetaddressesHashSet
addressesTUseraddress
EclipseDebugsession.saveuser
session.saveuser
September 2, 2004
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
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
Version 1.0
JTA
JTA Session JDBC Transaction
JDBC Connnection
JDBC Connection
September 2, 2004
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(){
}
}
September 2, 2004
Version 1.0
}
public class ClassB{
public void save (Order order){
session = sessionFactory.openSession();
session.save(order);
session.close();
}
}
public class ClassC{
public void save(){
}
}
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
Version 1.0
Hibernate UserTransaction
InitialContext UserTransaction
view-type="remote"
*
* @ejb.transaction type = "Required"
**/
public void save(){
//EJB
classA.save(user);
classB.save(log);
}//EJB
locking
cut-off
Hibernate
September 2, 2004
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.READ Hibernate
Criteria.setLockMode
Query.setLockMode
Session.lock
Hiberate SQL
for update
Select SQL
Optimistic Locking
September 2, 2004
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
TUser
September 2, 2004
Version 1.0
</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
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
September 2, 2004
Version 1.0
Hibernate
JDBC
Hibernate
Criteria.setFirstResult Criteria.setFetchSize
dialect
Public String getLimitString(
String querySelect,
September 2, 2004
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();
}
September 2, 2004
Version 1.0
Cache
Cache DOS SmartDrv2
Cache 114
Cache
.
Cache
Hibernate
Cache
Hibernate Cache
Hibernate JVM
Hibernate Hibernate
Hibernate
Hibernate
Hibernate Cache
Hibernate JDBC
JDBC Hibernate
DOS
September 2, 2004
Version 1.0
Cache Hibernate
Cache JCSJBossCache
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
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
September 2, 2004
Version 1.0
Cache
Cache usage
read-only
read-write
nonstrict-read-write
HashTable
EHCache
OSCache
SwarmCache
JBossCache
transactional
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
September 2, 2004
Version 1.0
Cache
Session
Session Hibernate Hibernate Session
JDBC Connection
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
Version 1.0
Servlet Servlet
TestServlet Tomcat
doGet
doGet TestServlet
session A session
A session session
session
ThreadLocal
ThreadLocal A session A
session
September 2, 2004
Version 1.0
Session
Hibernate ThreadLocal Session
September 2, 2004
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
Version 1.0
}
doFilter SessionFilter
Filter Servlet Session
Http Request Session
Session HttpSession
Session Session J
September 2, 2004
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
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
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
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;
}
}
September 2, 2004
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
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();
}
September 2, 2004
Version 1.0
ibatis
Hibernate
EJB
September 2, 2004