(五)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
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 <!-- 方言 --> 18 <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> 19 20 <!-- 控制台显示SQL --> 21 <property name="show_sql">true</property> 22 23 <!-- 自动更新表结构 --> 24 <property name="hbm2ddl.auto">update</property> 25 26 <mapping resource="com/wishwzp/model/Student.hbm.xml"/> 27 28 <mapping resource="com/wishwzp/model/Class.hbm.xml"/> 29 30 </session-factory> 31 32 </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 22 }
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 23 public Class getC() { 24 return c; 25 } 26 public void setC(Class c) { 27 this.c = c; 28 } 29 @Override 30 public String toString() { 31 return "Student [id=" + id + ", name=" + name + "]"; 32 } 33 34 35 }
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 <!-- 方言 --> 18 <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> 19 20 <!-- 控制台显示SQL --> 21 <property name="show_sql">true</property> 22 23 <!-- 自动更新表结构 --> 24 <property name="hbm2ddl.auto">update</property> 25 26 <mapping resource="com/wishwzp/model/Student.hbm.xml"/> 27 28 <mapping resource="com/wishwzp/model/Class.hbm.xml"/> 29 30 </session-factory> 31 32 </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 32 }
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 23 public Class getC() { 24 return c; 25 } 26 public void setC(Class c) { 27 this.c = c; 28 } 29 @Override 30 public String toString() { 31 return "Student [id=" + id + ", name=" + name + "]"; 32 } 33 34 35 }
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 62 @Test 63 public void testGetClass(){ 64 // Class c=(Class)session.get(Class.class, Long.valueOf(2)); 65 Class c=(Class)session.get(Class.class, Long.valueOf(1)); 66 System.out.println(c.getStudents()); 67 } 68 69 //update()方法 70 @Test 71 public void testUpdateClass(){ 72 Session session1=sessionFactory.openSession(); 73 session1.beginTransaction(); 74 Class c=(Class)session1.get(Class.class, Long.valueOf(1)); 75 session1.getTransaction().commit(); // 提交事务 76 session1.close(); 77 78 Session session2=sessionFactory.openSession(); 79 session2.beginTransaction(); 80 c.setName("08计算机本科2"); 81 session2.update(c); 82 session2.getTransaction().commit(); // 提交事务 83 session2.close(); 84 } 85 86 //saveOrUpdate()方法 87 @Test 88 public void testSaveOrUpdateClass(){ 89 Session session1=sessionFactory.openSession(); 90 session1.beginTransaction(); 91 Class c=(Class)session1.get(Class.class, Long.valueOf(1)); 92 session1.getTransaction().commit(); // 提交事务 93 session1.close(); 94 95 Session session2=sessionFactory.openSession(); 96 session2.beginTransaction(); 97 c.setName("08计算机本科3"); 98 99 Class c2=new Class(); 100 c2.setName("09计算机本科3"); 101 session2.saveOrUpdate(c); 102 session2.saveOrUpdate(c2); 103 session2.getTransaction().commit(); // 提交事务 104 session2.close(); 105 } 106 107 //merge()方法 108 @Test 109 public void testMergeClass(){ 110 Session session1=sessionFactory.openSession(); 111 session1.beginTransaction(); 112 Class c=(Class)session1.get(Class.class, Long.valueOf(1)); 113 session1.getTransaction().commit(); // 提交事务 114 session1.close(); 115 116 Session session2=sessionFactory.openSession(); 117 session2.beginTransaction(); 118 119 Class c2=(Class)session2.get(Class.class, Long.valueOf(1)); 120 c.setName("08计算机本科4"); 121 122 session2.merge(c); 123 124 session2.getTransaction().commit(); // 提交事务 125 session2.close(); 126 } 127 128 //delete()方法 129 @Test 130 public void testDeleteStudent(){ 131 Student student=(Student)session.load(Student.class, Long.valueOf(1)); 132 session.delete(student); 133 } 134 }