1.hibernate.cfg.xml
2.持久化类 Person
代码如下 |
复制代码 |
package org.Rudiment.hibernate;
import java.util.ArrayList;
import java.util.List;
public class Person {
private Integer id;
private String name;
private int age;
private List schools = new ArrayList();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List getSchools() {
return schools;
}
public void setSchools(List schools) {
this.schools = schools;
}
}
|
3. Person.cfg.xml
4. 操作持久化类的功能类 PersonHandler
代码如下 |
复制代码 |
package org.Rudiment.hibernate;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
public class PersonHandler {
//插入记录
public static void insertPerson(Person p)
{
Configuration conf = new Configuration();
conf.configure();
ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();
SessionFactory sf = conf.buildSessionFactory(sr);
Session sess = sf.openSession();
Transaction tx = sess.beginTransaction();
sess.save(p);
tx.commit();
sess.close();
}
//更新记录
public static void updatePerson(Person p)
{
Configuration conf = new Configuration();
conf.configure();
ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();
SessionFactory sf = conf.buildSessionFactory(sr);
Session sess = sf.openSession();
Transaction tx = sess.beginTransaction();
sess.update(p);
tx.commit();
sess.close();
}
//删除记录
public static void deletePerson(Person p)
{
Configuration conf = new Configuration();
conf.configure();
ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();
SessionFactory sf = conf.buildSessionFactory(sr);
Session sess = sf.openSession();
Transaction tx = sess.beginTransaction();
sess.delete(p);
tx.commit();
sess.close();
}
//查询记录
public static Person queryPerson(int id)
{
Configuration conf = new Configuration();
conf.configure();
ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();
SessionFactory sf = conf.buildSessionFactory(sr);
Session sess = sf.openSession();
Person p = (Person)sess.get(Person.class, id);
sess.close();
return p;
}
public static void main(String[] args)
{
Person p = new Person();
/*
//插入记录
p.setName("ITkezhan");
p.setAge(1);
List schools = new ArrayList();
schools.add("小学");
schools.add("初中");
schools.add("高中");
p.setSchools(schools);
insertPerson(p);
*/
/*
//更新记录
//括号内的5是对应Person表中的ID
p = queryPerson(5);
p.setAge(10);
p.setName("IT客栈");
updatePerson(p);
*/
/*
//删除记录
//括号内的5是对应Person表中的ID
p = queryPerson(5);
deletePerson(p);
*/
}
}
|
注:
1.只取消PersonHandler这个类main方法的第一个注释块,将会插入一条新的记录到数据库名为hibernate的Person表中。
代码如下 |
复制代码 |
mysql> use hibernate;
Database changed
mysql> select * from person;
+----+----------+------+
| ID | NAME | AGE |
+----+----------+------+
| 5 | ITkezhan | 1 |
+----+----------+------+
1 row in set (0.00 sec)
mysql> select * from school;
+----+---------+-----+
| ID | SCHOOLS | idx |
+----+---------+-----+
| 5 | 小学 | 0 |
| 5 | 初中 | 1 |
| 5 | 高中 | 2 |
+----+---------+-----+
3 rows in set (0.00 sec)
|
2.只取消PersonHandler这个类main方法的第二个注释块,将会更新查询出来的记录到数据库名为hibernate的Person表中。
代码如下 |
复制代码 |
mysql> select * from person;
+----+--------+------+
| ID | NAME | AGE |
+----+--------+------+
| 5 | IT客栈 | 10 |
+----+--------+------+
1 row in set (0.00 sec)
mysql> select * from school;
+----+---------+-----+
| ID | SCHOOLS | idx |
+----+---------+-----+
| 5 | 小学 | 0 |
| 5 | 初中 | 1 |
| 5 | 高中 | 2 |
+----+---------+-----+
3 rows in set (0.00 sec)
|
3.只取消PersonHandler这个类main方法的第三个注释块,将会删除查询出来的记录
下面详谈这些方法的一些注意的地方:
在说这些方法的时候,我们要先约定一些词语意思,Hibernate中的持久化对象支持如下几个对象状态:
瞬态:对象由 new 操作符创建,并且尚未与 Hibernate Session 关联的对象被认为处于瞬态。瞬态对象不会被持久化到数据库中,也不会被赋予持久化标识。如果程序中失去了瞬态对象的引用,瞬态对象将被垃圾回收机制销毁。使用Hibernate Session 可以将其变为持久化状态。
持久化:对象于 Hibernate Session 关联上。对这个对象属性的修改会影响数据库的数据内容。
脱管:曾今持久过的对象。由于与 Hibernate Session 脱离关联,这个对象称为脱管。
详细的概念请查看:轻量级JavaEE企业应用实战P386
=========================save()与persist()方法============================
Hibernate之所以提供与save()功能几乎完全类似的persist()方法,一方面是为了照顾JPA的用法习惯。另一方面,save() 和 persist() 方法还有一个区别:使用 save() 方法保存持久化对象时,该方法返回该持久化对象的标识属性(即对应记录的主键值);但使用persist()方法来保存持久化对象时,该方法没有任何返回值。因为 save() 方法需要立即返回持久化对象的标识属性值,所以程序执行 save() 方法会立即将持久化对象对应的数据插入数据库;而persist() 则保证当它在一个事务外部被调用时,并不立即转换成 insert 语句,这个功能是很有用的,尤其当我们封装一个长会话流程的时候,persist() 方法就显得尤为重要了。
=========================load()与get()方法============================
load() 方法和 get() 方法的主要区别在于是否延迟加载,使用 load() 方法将具有延迟加载功能,load() 方法不会立即访问数据库,当试图加载的记录不存在时,load() 方法可能返回一个未初始化的代理对象;而 get() 方法总是立即访问数据库,当试图加载的记录不存在时,get()方法将直接返回 null
========================= 脱管对象再次利用注意事项 =========================
对于一个曾经持久化过的、但现在已脱离了 Session 管理的持久化对象,我们把它称为处于脱管状态。当我们修改脱管对象的状态后,程序应该使用新的 Session 来保存这些修改。Hibernate 提供了 update()、merge()和updateOrSave()等方法来保存这些修改。当我们用另外一个Session来保存这种修改后,该脱管对象再次回到Session的管理之下,也就再次回到持久化状态。
========================= update() 和 merge() 方法 =========================
当需要使用update来保存程序对持久化对象所做的修改时候,如果不清楚该对象是否曾经持久化过,那么程序可以选择使用 updateOrSave() 方法,该方法自动判断该对象是否曾经持久化,如果曾经持久化过,就使用 update() 操作; 否则将使用 save() 操作。
merge()方法也可将程序对脱管对象所做的修改保存到数据库,但 merge() 与 update() 方法最大的区别是: merge() 方法不会持久化给定对象。举例来说,当我们执行 session.update(a)代码后,a对象将会变成持久化状态;而执行 session.merge(a)代码后,a对象依然不是持久化状态,a 对象依然不会被关联到 Session 上