• (三)映射对象标识符(OID)


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

    第一节:Hibernate 用对象标识符(OID)来区分对象

     

     例子:

    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     </session-factory>
    29 
    30 </hibernate-configuration>

     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     @Override
    21     public String toString() {
    22         return "Student [id=" + id + ", name=" + name + "]";
    23     }
    24     
    25     
    26 }

    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"></property>
    14     </class>
    15 
    16 </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.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(); // 生成一个session
    14         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);//false
    23         System.out.println(s1==s3);//true
    24         session.getTransaction().commit(); // 提交事务
    25         session.close(); // 关闭session
    26     }
    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 <?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     </session-factory>
    29 
    30 </hibernate-configuration>

    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     @Override
    21     public String toString() {
    22         return "Student [id=" + id + ", name=" + name + "]";
    23     }
    24     
    25     
    26 }

    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="increment"></generator>
    11         </id>
    12         
    13         <property name="name"></property>
    14     </class>
    15 
    16 </hibernate-mapping>

    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(); // 生成一个session
    14         session.beginTransaction(); // 开启事务
    15         
    16         Student s=new Student();
    17         s.setName("张三");
    18         session.save(s);
    19         
    20         session.getTransaction().commit(); // 提交事务
    21         session.close(); // 关闭session
    22     }
    23 }

    结果显示:

    当我继续在执行一下代码。。。。。

    结果显示:

    identity 例子:

    increment 例子的代码只改变一下Student.hbm.xml,其他什么代码都不改变。

    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="identity"></generator>
    11         </id>
    12         
    13         <property name="name"></property>
    14     </class>
    15 
    16 </hibernate-mapping>

    结果显示:

    当我继续在执行一下代码。。。。。

    结果显示:

    native 例子:

    increment 例子的代码只改变一下Student.hbm.xml,其他什么代码都不改变。

    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"></property>
    14     </class>
    15 
    16 </hibernate-mapping>

    结果显示:

    当我继续在执行一下代码。。。。。

    结果显示:

    主要native用的最多。

  • 相关阅读:
    multimap-swap
    multimap-size
    multimap-rend
    CentOS的利手:“Screen”一个可以在多个进程之间多路复用一个物理终端的窗口管理器
    对TCP/IP网络协议的深入浅出归纳
    程序员的数学:汉诺塔递归与非递归求解
    多柱汉诺塔问题探究
    汉诺塔问题的递归实现(扩展)
    CentOS---网络配置详解
    VMWare虚拟机下CentOS 配置网络实现远程连接,提供Web访问
  • 原文地址:https://www.cnblogs.com/wishwzp/p/5481201.html
Copyright © 2020-2023  润新知