操纵持久化对象
1.
理解
session
的缓存
2.
在
Hibernate
应用中
java
对象的状态
2
.
1
临时对象的特征
2
.
2
持久化对象的特征
2
.
3
游离对象的特征
3.
Session
的保存、更新、删除、查询方法
3
.
1 Save()
方法
3
.
2 update()
方法
3
.
3 saveOrupdate()
方法
3
.
4 load()
和
get()
方法
3
.
5 delete()
方法
4
.组成关系
session
的缓存
,当
session
的
save
方法持久化一个对象时
,
对象被加入到
session
的缓存中
,
只要
session
的缓存还没有被清空
,
对象仍然处于生命周期中
,
当
session
的
load()
方法从数据库中加载一个对象时
,session
先判断缓存中是否已经存在这个对象
,
如果存在就不需要到数据库中检索
.
以下代码通过
load()
方法加载数据到缓存中
Session session = HibernateSessionFactory.
getSession
();
Transaction tx = session.beginTransaction();
Person person =
new
Person();
person.setPersonName(
“jack”
);
person.setEmail(
“jack@sdi.com”
);
person.setTel(
“237229242”
);
session.save(person);
Person person1 = (Person)session.load(Person.
class
,
person.getPersonid());
tx.commit();
session.close();
临时对象的特征
:
1.
不处于
Session
缓存中
,
不被任何一个
Session
实例关联合
2.
在数据库中没有对应的记录
.
在以下情况
JAVA
对象进入临时状态
1.
通过
new
操作符创建的
java
对象
,
他不和数据库中的任何记录对
应
2.
session
的
delete( )
方法能使一个持久化对象或者游离对象转变为临时对象
.
以下代码演示了将一个持久化对象转换为临时对象
.
Person
person1
= (Person)session.load(Person.
class
,
new
Integer(45));
session.delete(
person1
);
持久化对象的特征
:
1.
位于一个
session
实例的缓存中
,
持久化对象总是被一个
session
关联
2.
持久化对象和数据库中的相关记录对应
.
3.
Session save()
方法把临时对象转换为持久化对象
4.
session
的
load()
或者
get()
返回的对象处于持久化对象
5.
session
的
find
方法返回的
List()
集合中存放的都是持久化对象
以下代码演示一个
java
对象同时被多个
session
关联
.
Session session = HibernateSessionFactory.
getSession
();
Session session1 = HibernateSessionFactory.
getSession
();
Transaction tx1 = session1.beginTransaction();
Transaction tx = session.beginTransaction();
Person person1 = (Person)session.load
(Person.
class
,
new
Integer(47));
session1.delete(person1);
tx.commit();
tx1.commit();
session.close();
session1.close();
游离对象的特征
:
-
不在位于
Session
的缓存中
,
游离对象不被
Session
关联
.
-
游离对象是由持久化对象转变过来的
,
在数据库中可能还存在与它对应的记录
游离对象和临时对象的区别
:
游离对象由持久化对象转变过来的
,
在数据库中还存
在对应的记录
,
而临时对象在数据库中没有对应的记录
.
Session
的
保存
,
更新
,
删除
,
查询方法
.
以下代码调用
session
的
save
把临时对象转换为持久化对象后
,
把数据库中的数据更新
.
Person person = new Person();
person.setPersonName(“mike”);
person.setEmail(“mike@sdi.com”);
person.setTel(“092423234”);
session.save(person);
person.setTel(
“723764234”
);
transaction.commit();
session.close();
以下代码演示了不同
session
中的对象传送
:
Session session = HibernateSessionFactory.getSession();
Transaction transaction = session.beginTransaction();
Person person = new Person();
person.setPersonName(“mike”);
person.setEmail(“mike@sdi.com”);
person.setTel(“092423234”);
session.save(person);
person.setTel(“723764234”);
transaction.commit();
session.close();
Session session1 = HibernateSessionFactory.getSession();
Transaction tx = session1.beginTransaction();
person.setPersonName(“scott”);
person.setEmail(“scott@sdi.com”);
person.setTel(“297423234”);
session1.save(person);
tx.commit();
select-before-update
=
“true”
当修改对象的属性时才执行
update
语句
.
Session
的
saveOrUpdate()
方法包含了
save()
和
update()
方法的功能
,
如果传入的参数是临时对象
,
就调用
save()
方法
,
如果传入的参数是游离对象
,
就调用
update()
方法
.
Session load()
和
get()
方法区别
:
当数据库中不存在与
OID
对应的记录时
,load()
方法抛出
org.hibernate.ObjectNotFoundException
异常
,
Get()
方法返回
null .
组成关系:以下代码演示了
Persons
对象和
Names
对象的组合关系:
Persons.hbm.xml
<
component
name
=
“names”
class
=
“com.test.pojo.Names”
>
<
property
name
=
“initial”
type
=
“string”
>
<
column
name
=
“initial”
length
=
“30”
/>
</
property
>
<
property
name
=
“firstName”
type
=
“string”
>
<
column
name
=
“firstName”
length
=
“50”
/>
</
property
>
<
property
name
=
“lastName”
type
=
“string”
>
<
column
name
=
“lastName”
length
=
“50”
/>
</
property
>
</
component
>
查询组合关系字段:
Persons persons = (Persons) session
.createQuery(
“from Persons p where p.names.firstName = :firstName and p.names.lastName = :lastName “)
.setString(“firstName”, “jeff”).setString(“lastName”, “worong”)
.uniqueResult();
实体类型和值类型的区别在于
:
实体类型有
OID ,
而值类型没有
OID