所有项目导入对应的hibernate的jar包、mysql的jar包和添加每次都需要用到的HibernateUtil.java

第一节:Hibernate 中四种对象状态

临时状态(transient):刚用new 语句创建,还没有被持久化,并且不处于Sesssion 的缓存中。处于临时状态的Java 对象被称为临时对象。

持久化状态(persistent):已经被持久化,并且加入到Session 的缓存中。处于持久化状态的Java 对象被称为持久化对象。

删除状态(removed):不再处于Session 的缓存中,并且Session 已经计划将其从数据库中删除。处于删除状态的Java 对象被称为删除对象。

游离状态(detached):已经被持久化,但不再处于Session 的缓存中。处于游离状态的Java 对象被称为游离对象。

例子:

hibernate.cfg.xml

  1. <?xml version='1.0' encoding='utf-8'?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  5.  
  6. <hibernate-configuration>
  7.  
  8. <session-factory>
  9.  
  10. <!--数据库连接设置 -->
  11. <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
  12. <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
  13. <property name="connection.username">root</property>
  14. <property name="connection.password">123456</property>
  15.  
  16. <!-- 方言 -->
  17. <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
  18.  
  19. <!-- 控制台显示SQL -->
  20. <property name="show_sql">true</property>
  21.  
  22. <!-- 自动更新表结构 -->
  23. <property name="hbm2ddl.auto">update</property>
  24.  
  25. <mapping resource="com/wishwzp/model/Student.hbm.xml"/>
  26.  
  27. <mapping resource="com/wishwzp/model/Class.hbm.xml"/>
  28.  
  29. </session-factory>
  30.  
  31. </hibernate-configuration>

Class.java

  1. package com.wishwzp.model;
  2.  
  3. public class Class {
  4.  
  5. private long id;
  6. private String name;
  7.  
  8. public long getId() {
  9. return id;
  10. }
  11. public void setId(long id) {
  12. this.id = id;
  13. }
  14. public String getName() {
  15. return name;
  16. }
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20.  
  21. }

Class.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5.  
  6. <hibernate-mapping package="com.wishwzp.model">
  7.  
  8. <class name="Class" table="t_class">
  9. <id name="id" column="classId">
  10. <generator class="native"></generator>
  11. </id>
  12.  
  13. <property name="name" column="className"></property>
  14. </class>
  15.  
  16. </hibernate-mapping>

Student.java

  1. package com.wishwzp.model;
  2.  
  3. public class Student {
  4.  
  5. private long id;
  6. private String name;
  7. private Class c;
  8.  
  9. public long getId() {
  10. return id;
  11. }
  12. public void setId(long id) {
  13. this.id = id;
  14. }
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21.  
  22. public Class getC() {
  23. return c;
  24. }
  25. public void setC(Class c) {
  26. this.c = c;
  27. }
  28. @Override
  29. public String toString() {
  30. return "Student [id=" + id + ", name=" + name + "]";
  31. }
  32.  
  33. }

Student.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5.  
  6. <hibernate-mapping package="com.wishwzp.model">
  7.  
  8. <class name="Student" table="t_student">
  9. <id name="id" column="stuId">
  10. <generator class="native"></generator>
  11. </id>
  12.  
  13. <property name="name" column="stuName"></property>
  14.  
  15. <many-to-one name="c" column="classId" class="com.wishwzp.model.Class" cascade="save-update"></many-to-one>
  16. </class>
  17.  
  18. </hibernate-mapping>

StudentTest.java

  1. package com.wishwzp.service;
  2.  
  3. import org.hibernate.Session;
  4. import org.hibernate.SessionFactory;
  5.  
  6. import com.wishwzp.model.Class;
  7. import com.wishwzp.model.Student;
  8. import com.wishwzp.util.HibernateUtil;
  9.  
  10. public class StudentTest {
  11.  
  12. public static void main(String[] args) {
  13. SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
  14. Session session=sessionFactory.openSession(); // 生成一个session
  15. session.beginTransaction(); // 开启事务
  16.  
  17. Class c1=new Class(); // 临时对象1
  18. c1.setName("08计本");
  19.  
  20. Class c2=new Class(); // 临时对象2
  21. c2.setName("09计本");
  22.  
  23. session.save(c1); // 持久化对象
  24. session.save(c2); // 持久化对象
  25.  
  26. session.delete(c2); // 删除对象
  27.  
  28. session.getTransaction().commit(); // 提交事务
  29. session.close(); // 关闭session
  30.  
  31. System.out.println(c1.getName()); // 游离对象
  32. System.out.println(c2.getName()); // 删除对象
  33. }
  34. }

结果显示:

第二节: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

  1. <?xml version='1.0' encoding='utf-8'?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  5.  
  6. <hibernate-configuration>
  7.  
  8. <session-factory>
  9.  
  10. <!--数据库连接设置 -->
  11. <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
  12. <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
  13. <property name="connection.username">root</property>
  14. <property name="connection.password">123456</property>
  15.  
  16. <!-- 方言 -->
  17. <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
  18.  
  19. <!-- 控制台显示SQL -->
  20. <property name="show_sql">true</property>
  21.  
  22. <!-- 自动更新表结构 -->
  23. <property name="hbm2ddl.auto">update</property>
  24.  
  25. <mapping resource="com/wishwzp/model/Student.hbm.xml"/>
  26.  
  27. <mapping resource="com/wishwzp/model/Class.hbm.xml"/>
  28.  
  29. </session-factory>
  30.  
  31. </hibernate-configuration>

Class.java

  1. package com.wishwzp.model;
  2.  
  3. import java.util.HashSet;
  4. import java.util.Set;
  5.  
  6. public class Class {
  7.  
  8. private long id;
  9. private String name;
  10. private Set<Student> students=new HashSet<Student>();
  11.  
  12. public long getId() {
  13. return id;
  14. }
  15. public void setId(long id) {
  16. this.id = id;
  17. }
  18. public String getName() {
  19. return name;
  20. }
  21. public void setName(String name) {
  22. this.name = name;
  23. }
  24. public Set<Student> getStudents() {
  25. return students;
  26. }
  27. public void setStudents(Set<Student> students) {
  28. this.students = students;
  29. }
  30.  
  31. }

Class.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5.  
  6. <hibernate-mapping package="com.wishwzp.model">
  7.  
  8. <class name="Class" table="t_class">
  9. <id name="id" column="classId">
  10. <generator class="native"></generator>
  11. </id>
  12.  
  13. <property name="name" column="className"></property>
  14.  
  15. <set name="students" cascade="delete" inverse="true">
  16. <key column="classId"></key>
  17. <one-to-many class="com.wishwzp.model.Student"/>
  18. </set>
  19. </class>
  20.  
  21. </hibernate-mapping>

Student.java

  1. package com.wishwzp.model;
  2.  
  3. public class Student {
  4.  
  5. private long id;
  6. private String name;
  7. private Class c;
  8.  
  9. public long getId() {
  10. return id;
  11. }
  12. public void setId(long id) {
  13. this.id = id;
  14. }
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21.  
  22. public Class getC() {
  23. return c;
  24. }
  25. public void setC(Class c) {
  26. this.c = c;
  27. }
  28. @Override
  29. public String toString() {
  30. return "Student [id=" + id + ", name=" + name + "]";
  31. }
  32.  
  33. }

Studnet.hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5.  
  6. <hibernate-mapping package="com.wishwzp.model">
  7.  
  8. <class name="Student" table="t_student">
  9. <id name="id" column="stuId">
  10. <generator class="native"></generator>
  11. </id>
  12.  
  13. <property name="name" column="stuName"></property>
  14.  
  15. <many-to-one name="c" column="classId" class="com.wishwzp.model.Class" cascade="save-update"></many-to-one>
  16. </class>
  17.  
  18. </hibernate-mapping>

StudentTest.java

  1. package com.wishwzp.service;
  2.  
  3. import java.util.Iterator;
  4. import java.util.Set;
  5.  
  6. import org.hibernate.Session;
  7. import org.hibernate.SessionFactory;
  8. import org.junit.After;
  9. import org.junit.Before;
  10. import org.junit.Test;
  11.  
  12. import com.wishwzp.model.Class;
  13. import com.wishwzp.model.Student;
  14. import com.wishwzp.util.HibernateUtil;
  15.  
  16. public class StudentTest {
  17.  
  18. private SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
  19. private Session session;
  20.  
  21. @Before
  22. public void setUp() throws Exception {
  23. session=sessionFactory.openSession(); // 生成一个session
  24. session.beginTransaction(); // 开启事务
  25. }
  26.  
  27. @After
  28. public void tearDown() throws Exception {
  29. session.getTransaction().commit(); // 提交事务
  30. session.close(); // 关闭session
  31. }
  32.  
  33. //save()方法
  34. @Test
  35. public void testSaveClassAndStudent() {
  36. Class c=new Class();
  37. c.setName("08计本");
  38.  
  39. Student s1=new Student();
  40. s1.setName("张三");
  41. s1.setC(c);
  42.  
  43. Student s2=new Student();
  44. s2.setName("李四");
  45. s2.setC(c);
  46.  
  47. session.save(s1);
  48. session.save(s2);
  49.  
  50. }
  51.  
  52. //load()方法和get()方法的区别
  53. //Load()方法会抛出异常,而get()方法返回null;
  54. @Test
  55. public void testLoadClass(){
  56. // Class c=(Class)session.load(Class.class, Long.valueOf(2));
  57. Class c=(Class)session.load(Class.class, Long.valueOf(1));
  58. System.out.println(c.getStudents());
  59. }
  60.  
  61. @Test
  62. public void testGetClass(){
  63. // Class c=(Class)session.get(Class.class, Long.valueOf(2));
  64. Class c=(Class)session.get(Class.class, Long.valueOf(1));
  65. System.out.println(c.getStudents());
  66. }
  67.  
  68. //update()方法
  69. @Test
  70. public void testUpdateClass(){
  71. Session session1=sessionFactory.openSession();
  72. session1.beginTransaction();
  73. Class c=(Class)session1.get(Class.class, Long.valueOf(1));
  74. session1.getTransaction().commit(); // 提交事务
  75. session1.close();
  76.  
  77. Session session2=sessionFactory.openSession();
  78. session2.beginTransaction();
  79. c.setName("08计算机本科2");
  80. session2.update(c);
  81. session2.getTransaction().commit(); // 提交事务
  82. session2.close();
  83. }
  84.  
  85. //saveOrUpdate()方法
  86. @Test
  87. public void testSaveOrUpdateClass(){
  88. Session session1=sessionFactory.openSession();
  89. session1.beginTransaction();
  90. Class c=(Class)session1.get(Class.class, Long.valueOf(1));
  91. session1.getTransaction().commit(); // 提交事务
  92. session1.close();
  93.  
  94. Session session2=sessionFactory.openSession();
  95. session2.beginTransaction();
  96. c.setName("08计算机本科3");
  97.  
  98. Class c2=new Class();
  99. c2.setName("09计算机本科3");
  100. session2.saveOrUpdate(c);
  101. session2.saveOrUpdate(c2);
  102. session2.getTransaction().commit(); // 提交事务
  103. session2.close();
  104. }
  105.  
  106. //merge()方法
  107. @Test
  108. public void testMergeClass(){
  109. Session session1=sessionFactory.openSession();
  110. session1.beginTransaction();
  111. Class c=(Class)session1.get(Class.class, Long.valueOf(1));
  112. session1.getTransaction().commit(); // 提交事务
  113. session1.close();
  114.  
  115. Session session2=sessionFactory.openSession();
  116. session2.beginTransaction();
  117.  
  118. Class c2=(Class)session2.get(Class.class, Long.valueOf(1));
  119. c.setName("08计算机本科4");
  120.  
  121. session2.merge(c);
  122.  
  123. session2.getTransaction().commit(); // 提交事务
  124. session2.close();
  125. }
  126.  
  127. //delete()方法
  128. @Test
  129. public void testDeleteStudent(){
  130. Student student=(Student)session.load(Student.class, Long.valueOf(1));
  131. session.delete(student);
  132. }
  133. }

(五)Hibernate 操作对象的更多相关文章

  1. Hibernate学习5—Hibernate操作对象2

    第二节:Session 常用方法讲解 2)load和get()方法: 数据库中不存在与OID 对应的记录,Load()方法会抛出异常: load方法默认采用延迟加载,load出来的对象是一个代理类.开 ...

  2. Hibernate学习5—Hibernate操作对象

    第一节:Hibernate 中四种对象状态 删除状态:处于删除状态的Java 对象被称为删除对象.比如说session delete一个对象,这个对象就不处于session缓存中了, 已经从sessi ...

  3. Excel VBA入门(五)Excel对象操作

    本章是本系列教程的重点.但我觉得应该不是难点.从第零章开始到学完本章,应该可以把VBA用于实战中了. Excel对象主要有4个: 工作薄 Workbook 工作表 Worksheet 单元格区域 Ra ...

  4. Hibernate -- 操作持久化对象

    知识点2: session概述 Session 接口是 Hibernate 向应用程序提供的操纵对数据库的最主要的接口,它提供了基本的保存,更新, 删除和加载Java对象的方法. 知识点3:理解ses ...

  5. PHP中的MySQLi扩展学习(五)MySQLI_STMT对象操作

    就像 PDO 中的 PDO_Statment 对象一样,MySQLI_STMT 对象也是一个预处理语句所形成的对象,专门用来操作 MySQLi 所生成的预处理语句的.其实操作方式之类也都比较相似,不外 ...

  6. 攻城狮在路上(壹) Hibernate(六)--- 通过Hibernate操纵对象(上)

    一.Hibernate缓存简介: Session接口是Hibernate向应用程序提供的操纵数据接口的最主要接口,它提供了基本的保存.更新.删除和加载Java对象的方法. Session具有一个缓存, ...

  7. Hibernate操作和保存方式

    Session API [Java Hibernate 之 CRUD 操作]http://www.codeceo.com/article/java-hibernate-crud.html   [Ses ...

  8. 关于hibernate中对象的三种状态分析

    一,首先hibernate中对象的状态有三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate().get().load ...

  9. Hibernate框架--对象的状态,缓存, 映射

    回顾Hibernate第二天: 1.  一对多与多对一 2. 多对多 3. inverse/cascade 4. 关联关系的维护 一对多: <set name="映射的集合属性&quo ...

随机推荐

  1. 录制屏幕(gif)便于在博客中嵌入软件licecap

  2. linux内核中分配4M以上大内存的方法

    在内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数,     "if (unlikely(order >= ...

  3. vijosP1447 开关灯泡

    vijosP1447 开关灯泡 链接:https://vijos.org/p/1447 [思路] 数学+高精度. 分析题目:题中有言,i时刻将其所有倍数的灯熄灭,由此得知一个数有多少个倍数就会被操作多 ...

  4. C#调用VC dll输出参数

    最近做项目需要把以前Vc写的程序整合到VS2005来,用c#写的,以前VC的动态连接库写好了,重写比较麻烦,让C#调用VC dll就好了.但碰到了一个问题:VC中作为输出参数的char*类型的变量应该 ...

  5. (android 源码下开发应用程序) 如何在 Android 各 level ( 包含 user space 與 kernel space ) 使用dump call stack的方法

    http://janbarry0914.blogspot.com/2014/07/androiddump-call-stack.html dump call stack [文章重點] 了解 Andro ...

  6. HTTP 缓存控制总结

    引言 通过网络获取内容既缓慢,成本又高:大的响应需要在客户端和服务器之间进行多次往返通信,这拖延了浏览器可以使用和处理内容的时间,同时也增加了访问者的数据成本.因此,缓存和重用以前获取的资源的能力成为 ...

  7. Java开发中常见的危险信号(中)

    本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...

  8. 一步一步学android控件(之十六)—— CheckBox

    根据使用场景不同,有时候使用系统默认的CheckBox样式就可以了,但是有时候就需要自定义CheckBox的样式.今天主要学习如何自定义CheckBox样式.在CheckBox状态改变时有时需要做一些 ...

  9. 文件正在上传的转圈圈gif图片引出的fixed定位和absolute定位

     文件正在上传的转圈圈gif图片  一.文件上传时,未上传返回成功状态之前给个gif动态图片显示在页面,改善用户体验. <!--S 遮罩层 --> <div id="mas ...

  10. [caffe]深度学习之图像分类模型VGG解读

    一.简单介绍 vgg和googlenet是2014年imagenet竞赛的双雄,这两类模型结构有一个共同特点是go deeper.跟googlenet不同的是.vgg继承了lenet以及alexnet ...