(五)Hibernate 操作对象
所有项目导入对应的hibernate的jar包、mysql的jar包和添加每次都需要用到的HibernateUtil.java
第一节:Hibernate 中四种对象状态
临时状态(transient):刚用new 语句创建,还没有被持久化,并且不处于Sesssion 的缓存中。处于临时状态的Java 对象被称为临时对象。
持久化状态(persistent):已经被持久化,并且加入到Session 的缓存中。处于持久化状态的Java 对象被称为持久化对象。
删除状态(removed):不再处于Session 的缓存中,并且Session 已经计划将其从数据库中删除。处于删除状态的Java 对象被称为删除对象。
游离状态(detached):已经被持久化,但不再处于Session 的缓存中。处于游离状态的Java 对象被称为游离对象。




例子:
hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!--数据库连接设置 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property> <!-- 方言 -->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> <!-- 控制台显示SQL -->
<property name="show_sql">true</property> <!-- 自动更新表结构 -->
<property name="hbm2ddl.auto">update</property> <mapping resource="com/wishwzp/model/Student.hbm.xml"/> <mapping resource="com/wishwzp/model/Class.hbm.xml"/> </session-factory> </hibernate-configuration>
Class.java
package com.wishwzp.model;
public class Class {
private long id;
private String name;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Class.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.wishwzp.model"> <class name="Class" table="t_class">
<id name="id" column="classId">
<generator class="native"></generator>
</id> <property name="name" column="className"></property>
</class> </hibernate-mapping>
Student.java
package com.wishwzp.model;
public class Student {
private long id;
private String name;
private Class c;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Class getC() {
return c;
}
public void setC(Class c) {
this.c = c;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
}
Student.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.wishwzp.model"> <class name="Student" table="t_student">
<id name="id" column="stuId">
<generator class="native"></generator>
</id> <property name="name" column="stuName"></property> <many-to-one name="c" column="classId" class="com.wishwzp.model.Class" cascade="save-update"></many-to-one>
</class> </hibernate-mapping>
StudentTest.java
package com.wishwzp.service; import org.hibernate.Session;
import org.hibernate.SessionFactory; import com.wishwzp.model.Class;
import com.wishwzp.model.Student;
import com.wishwzp.util.HibernateUtil; public class StudentTest { public static void main(String[] args) {
SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
Session session=sessionFactory.openSession(); // 生成一个session
session.beginTransaction(); // 开启事务 Class c1=new Class(); // 临时对象1
c1.setName("08计本"); Class c2=new Class(); // 临时对象2
c2.setName("09计本"); session.save(c1); // 持久化对象
session.save(c2); // 持久化对象 session.delete(c2); // 删除对象 session.getTransaction().commit(); // 提交事务
session.close(); // 关闭session System.out.println(c1.getName()); // 游离对象
System.out.println(c2.getName()); // 删除对象
}
}
结果显示:

第二节:Session 常用方法讲解
1,save()方法将一个临时对象转变成持久化对象;
2,load()方法VS get()方法
都是根据OID 从数据库中加载一个持久化对象。
区别1:假如数据库中不存在与OID 对应的记录,Load()方法会抛出异常,而get()方法返回null;
区别2:load 方法默认采用延迟加载策略,get 方法采用立即检索策略;
2,update()方法将一个游离对象转变为持久化对象;
3,saveOrUpdate()方法包含了save()和update()方法;
4,merge()方法,合并对象;
5,delete()方法,删除对象;
例子:
hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!--数据库连接设置 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property> <!-- 方言 -->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> <!-- 控制台显示SQL -->
<property name="show_sql">true</property> <!-- 自动更新表结构 -->
<property name="hbm2ddl.auto">update</property> <mapping resource="com/wishwzp/model/Student.hbm.xml"/> <mapping resource="com/wishwzp/model/Class.hbm.xml"/> </session-factory> </hibernate-configuration>
Class.java
package com.wishwzp.model; import java.util.HashSet;
import java.util.Set; public class Class { private long id;
private String name;
private Set<Student> students=new HashSet<Student>(); public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
} }
Class.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.wishwzp.model"> <class name="Class" table="t_class">
<id name="id" column="classId">
<generator class="native"></generator>
</id> <property name="name" column="className"></property> <set name="students" cascade="delete" inverse="true">
<key column="classId"></key>
<one-to-many class="com.wishwzp.model.Student"/>
</set>
</class> </hibernate-mapping>
Student.java
package com.wishwzp.model;
public class Student {
private long id;
private String name;
private Class c;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Class getC() {
return c;
}
public void setC(Class c) {
this.c = c;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
}
Studnet.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.wishwzp.model"> <class name="Student" table="t_student">
<id name="id" column="stuId">
<generator class="native"></generator>
</id> <property name="name" column="stuName"></property> <many-to-one name="c" column="classId" class="com.wishwzp.model.Class" cascade="save-update"></many-to-one>
</class> </hibernate-mapping>
StudentTest.java
package com.wishwzp.service; import java.util.Iterator;
import java.util.Set; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import com.wishwzp.model.Class;
import com.wishwzp.model.Student;
import com.wishwzp.util.HibernateUtil; public class StudentTest { private SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
private Session session; @Before
public void setUp() throws Exception {
session=sessionFactory.openSession(); // 生成一个session
session.beginTransaction(); // 开启事务
} @After
public void tearDown() throws Exception {
session.getTransaction().commit(); // 提交事务
session.close(); // 关闭session
} //save()方法
@Test
public void testSaveClassAndStudent() {
Class c=new Class();
c.setName("08计本"); Student s1=new Student();
s1.setName("张三");
s1.setC(c); Student s2=new Student();
s2.setName("李四");
s2.setC(c); session.save(s1);
session.save(s2); } //load()方法和get()方法的区别
//Load()方法会抛出异常,而get()方法返回null;
@Test
public void testLoadClass(){
// Class c=(Class)session.load(Class.class, Long.valueOf(2));
Class c=(Class)session.load(Class.class, Long.valueOf(1));
System.out.println(c.getStudents());
} @Test
public void testGetClass(){
// Class c=(Class)session.get(Class.class, Long.valueOf(2));
Class c=(Class)session.get(Class.class, Long.valueOf(1));
System.out.println(c.getStudents());
} //update()方法
@Test
public void testUpdateClass(){
Session session1=sessionFactory.openSession();
session1.beginTransaction();
Class c=(Class)session1.get(Class.class, Long.valueOf(1));
session1.getTransaction().commit(); // 提交事务
session1.close(); Session session2=sessionFactory.openSession();
session2.beginTransaction();
c.setName("08计算机本科2");
session2.update(c);
session2.getTransaction().commit(); // 提交事务
session2.close();
} //saveOrUpdate()方法
@Test
public void testSaveOrUpdateClass(){
Session session1=sessionFactory.openSession();
session1.beginTransaction();
Class c=(Class)session1.get(Class.class, Long.valueOf(1));
session1.getTransaction().commit(); // 提交事务
session1.close(); Session session2=sessionFactory.openSession();
session2.beginTransaction();
c.setName("08计算机本科3"); Class c2=new Class();
c2.setName("09计算机本科3");
session2.saveOrUpdate(c);
session2.saveOrUpdate(c2);
session2.getTransaction().commit(); // 提交事务
session2.close();
} //merge()方法
@Test
public void testMergeClass(){
Session session1=sessionFactory.openSession();
session1.beginTransaction();
Class c=(Class)session1.get(Class.class, Long.valueOf(1));
session1.getTransaction().commit(); // 提交事务
session1.close(); Session session2=sessionFactory.openSession();
session2.beginTransaction(); Class c2=(Class)session2.get(Class.class, Long.valueOf(1));
c.setName("08计算机本科4"); session2.merge(c); session2.getTransaction().commit(); // 提交事务
session2.close();
} //delete()方法
@Test
public void testDeleteStudent(){
Student student=(Student)session.load(Student.class, Long.valueOf(1));
session.delete(student);
}
}
(五)Hibernate 操作对象的更多相关文章
- Hibernate学习5—Hibernate操作对象2
第二节:Session 常用方法讲解 2)load和get()方法: 数据库中不存在与OID 对应的记录,Load()方法会抛出异常: load方法默认采用延迟加载,load出来的对象是一个代理类.开 ...
- Hibernate学习5—Hibernate操作对象
第一节:Hibernate 中四种对象状态 删除状态:处于删除状态的Java 对象被称为删除对象.比如说session delete一个对象,这个对象就不处于session缓存中了, 已经从sessi ...
- Excel VBA入门(五)Excel对象操作
本章是本系列教程的重点.但我觉得应该不是难点.从第零章开始到学完本章,应该可以把VBA用于实战中了. Excel对象主要有4个: 工作薄 Workbook 工作表 Worksheet 单元格区域 Ra ...
- Hibernate -- 操作持久化对象
知识点2: session概述 Session 接口是 Hibernate 向应用程序提供的操纵对数据库的最主要的接口,它提供了基本的保存,更新, 删除和加载Java对象的方法. 知识点3:理解ses ...
- PHP中的MySQLi扩展学习(五)MySQLI_STMT对象操作
就像 PDO 中的 PDO_Statment 对象一样,MySQLI_STMT 对象也是一个预处理语句所形成的对象,专门用来操作 MySQLi 所生成的预处理语句的.其实操作方式之类也都比较相似,不外 ...
- 攻城狮在路上(壹) Hibernate(六)--- 通过Hibernate操纵对象(上)
一.Hibernate缓存简介: Session接口是Hibernate向应用程序提供的操纵数据接口的最主要接口,它提供了基本的保存.更新.删除和加载Java对象的方法. Session具有一个缓存, ...
- Hibernate操作和保存方式
Session API [Java Hibernate 之 CRUD 操作]http://www.codeceo.com/article/java-hibernate-crud.html [Ses ...
- 关于hibernate中对象的三种状态分析
一,首先hibernate中对象的状态有三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate().get().load ...
- Hibernate框架--对象的状态,缓存, 映射
回顾Hibernate第二天: 1. 一对多与多对一 2. 多对多 3. inverse/cascade 4. 关联关系的维护 一对多: <set name="映射的集合属性&quo ...
随机推荐
- ionic如何uglify和minify你的js,css,image,png....
Install: 1.ionic start myapp blank 2.cd myapp 3.npm install cordova-uglify or npm install ...
- linux统计文件夹某一些文件的大小总和
du -m smallgame_2006* | awk '{sum += $1}; END{print sum}' -m代表单位是MB, awk命令需要'',且命令需换行
- Mac Vim 如何设置高亮
首先进入如下目录 cd /usr/share/vim 然后打开vimrc sudo vim vimrc 在vimrc中的“set backspace=2”这行下插入如下代码: set ai " ...
- zoj Simple Equation 数论
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5176 AX+BY = XY => (X-B)*(Y-A)= ...
- get方法
public string HttpGet(string Url, string postDataStr) { HttpWebRequest request = (HttpWebRequest)Web ...
- 教程-Delphi源代码--后延函数
说明: 1)TTtimer控件 TTtimer控件的实质是调用WindowsAPI定时函数SetTimer和KillTimer来实现的,并简化了对WM_TIMER消息的处理过程.通过设置OnTimer ...
- 算法之旅,直奔<algorithm>之十三 fill
fill(vs2010) 引言 这是我学习总结<algorithm>的第十三篇,fill是一个很好的初始化工具.大学挺好,好好珍惜... 作用 fill 的作用是 给容器里一个指定的范围 ...
- sdk 命令行
1.关闭服务命令:adb kill-server 2. 启动服务命令:adb start-server 3.查询当前设备命令:adb devices 4.安装应用程序命令:adb install [a ...
- HTML中Select的使用具体解释
<html> <head> <SCRIPT LANGUAGE="JavaScript"> <!-- //oSelect 列表的底部加入了一 ...
- 在配置XML时报的The reference to entity "dataSource" must end with the ';' delimiter错误
<?xml version="1.0" encoding="UTF-8"?> <ECharts> <element>http ...