所有项目导入对应的hibernate的jar包、mysql的jar包和添加每次都需要用到的HibernateUtil.java
第一节:Hibernate 用对象标识符(OID)来区分对象
例子:
hibernate.cfg.xml
1 2 5 67 8 9 10 11 29 30com.mysql.jdbc.Driver 12jdbc:mysql://localhost:3306/hibernate 13root 14123456 15 16 17 18org.hibernate.dialect.MySQL5Dialect 19 20 21true 22 23 24update 25 2627 28
Student.java
1 package com.wishwzp.model; 2 3 public class Student { 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 @Override21 public String toString() {22 return "Student [id=" + id + ", name=" + name + "]";23 }24 25 26 }
Student.hbm.xml
1 2 5 67 8 9 15 1610 12 1311 14
StudentTest.java
1 package com.wishwzp.service; 2 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 6 import com.wishwzp.model.Student; 7 import com.wishwzp.util.HibernateUtil; 8 9 public class StudentTest {10 11 public static void main(String[] args) {12 SessionFactory sessionFactory=HibernateUtil.getSessionFactory();13 Session session=sessionFactory.openSession(); // 生成一个session14 session.beginTransaction(); // 开启事务15 16 //获取主键为1的学生17 Student s1=(Student)session.get(Student.class, Long.valueOf(1));//当执行到这里的时候Session缓冲中会有OID为1的Studnet对象18 //获取主键为2的学生19 Student s2=(Student)session.get(Student.class, Long.valueOf(2));//当执行到这里的时候Session缓冲中会有OID为2的Studnet对象20 //获取主键为1的学生21 Student s3=(Student)session.get(Student.class, Long.valueOf(1));//在Session缓冲中找到了UID为1,所以指向了UID为1的对象22 System.out.println(s1==s2);//false23 System.out.println(s1==s3);//true24 session.getTransaction().commit(); // 提交事务25 session.close(); // 关闭session26 }27 }
这是数据库的信息:
结果显示:
这就表明S1和S3是指向一个地址的
第二节:Hibernate 对象标识符生成策略
主键的分类
业务主键VS 代理主键
代理主键是不具有业务性的;
1,increment 由Hibernate 自动以递增的方式生成标识符,适用代理主键;
2,identity 由底层数据库生成标识符;适用代理主键;
3,sequcence 由Hibernate 根据底层数据库的序列来生成标识符;适用代理主键;
4,hilo Hibernate 根据high/low 算法来生成标识符。适用代理主键
5,native 根据底层数据库对自动生成标识符的支持能力, 来选择identity,sequence 或hilo;适用代理主键;
increment 例子:
hibernate.cfg.xml
1 2 5 67 8 9 10 11 29 30com.mysql.jdbc.Driver 12jdbc:mysql://localhost:3306/hibernate 13root 14123456 15 16 17 18org.hibernate.dialect.MySQL5Dialect 19 20 21true 22 23 24update 25 2627 28
Student.java
1 package com.wishwzp.model; 2 3 public class Student { 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 @Override21 public String toString() {22 return "Student [id=" + id + ", name=" + name + "]";23 }24 25 26 }
Student.hbm.xml
1 2 5 67 8 9 15 1610 12 1311 14
StudentTest2.java
1 package com.wishwzp.service; 2 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 6 import com.wishwzp.model.Student; 7 import com.wishwzp.util.HibernateUtil; 8 9 public class StudentTest2 {10 11 public static void main(String[] args) {12 SessionFactory sessionFactory=HibernateUtil.getSessionFactory();13 Session session=sessionFactory.openSession(); // 生成一个session14 session.beginTransaction(); // 开启事务15 16 Student s=new Student();17 s.setName("张三");18 session.save(s);19 20 session.getTransaction().commit(); // 提交事务21 session.close(); // 关闭session22 }23 }
结果显示:
当我继续在执行一下代码。。。。。
结果显示:
identity 例子:
increment 例子的代码只改变一下Student.hbm.xml,其他什么代码都不改变。
Student.hbm.xml
1 2 5 67 8 9 15 1610 12 1311 14
结果显示:
当我继续在执行一下代码。。。。。
结果显示:
native 例子:
increment 例子的代码只改变一下Student.hbm.xml,其他什么代码都不改变。
Student.hbm.xml
1 2 5 67 8 9 15 1610 12 1311 14
结果显示:
当我继续在执行一下代码。。。。。
结果显示:
主要native用的最多。