(五)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 ...
随机推荐
- 录制屏幕(gif)便于在博客中嵌入软件licecap
- linux内核中分配4M以上大内存的方法
在内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数, "if (unlikely(order >= ...
- vijosP1447 开关灯泡
vijosP1447 开关灯泡 链接:https://vijos.org/p/1447 [思路] 数学+高精度. 分析题目:题中有言,i时刻将其所有倍数的灯熄灭,由此得知一个数有多少个倍数就会被操作多 ...
- C#调用VC dll输出参数
最近做项目需要把以前Vc写的程序整合到VS2005来,用c#写的,以前VC的动态连接库写好了,重写比较麻烦,让C#调用VC dll就好了.但碰到了一个问题:VC中作为输出参数的char*类型的变量应该 ...
- (android 源码下开发应用程序) 如何在 Android 各 level ( 包含 user space 與 kernel space ) 使用dump call stack的方法
http://janbarry0914.blogspot.com/2014/07/androiddump-call-stack.html dump call stack [文章重點] 了解 Andro ...
- HTTP 缓存控制总结
引言 通过网络获取内容既缓慢,成本又高:大的响应需要在客户端和服务器之间进行多次往返通信,这拖延了浏览器可以使用和处理内容的时间,同时也增加了访问者的数据成本.因此,缓存和重用以前获取的资源的能力成为 ...
- Java开发中常见的危险信号(中)
本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...
- 一步一步学android控件(之十六)—— CheckBox
根据使用场景不同,有时候使用系统默认的CheckBox样式就可以了,但是有时候就需要自定义CheckBox的样式.今天主要学习如何自定义CheckBox样式.在CheckBox状态改变时有时需要做一些 ...
- 文件正在上传的转圈圈gif图片引出的fixed定位和absolute定位
文件正在上传的转圈圈gif图片 一.文件上传时,未上传返回成功状态之前给个gif动态图片显示在页面,改善用户体验. <!--S 遮罩层 --> <div id="mas ...
- [caffe]深度学习之图像分类模型VGG解读
一.简单介绍 vgg和googlenet是2014年imagenet竞赛的双雄,这两类模型结构有一个共同特点是go deeper.跟googlenet不同的是.vgg继承了lenet以及alexnet ...