zoukankan      html  css  js  c++  java
  • Hibernate学习3—映射对象标识符(OID)

    一、Hibernate 用对象标识符(OID)来区分对象                                      

    作如下代码的实验:

    public class StudentTest {
        public static void main(String[] args) {
            SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
            Session session = sessionFactory.openSession();    
            session.beginTransaction();    
            
            Student s1 = (Student) session.get(Student.class, 1L);
            Student s2 = (Student) session.get(Student.class, 2L);
            Student s3 = (Student) session.get(Student.class, 1L);
            System.out.println(s1==s2);    //false
            System.out.println(s1==s3);    //true 说明s1 和 s3指向的是同一个对象
            
            session.getTransaction().commit();    
            session.close();    
        }
    }
    View Code

    console:

    s1和s3指向的是session中同一个OID为1的Student对象;

    二、Hibernate 对象标识符生成策略                                          

    生成主键的一个策略;
    代理主键:stuId,纯编号,不具有任何业务意义;
    比如你取的主键是学号,stuNo,也是唯一的,这是具有业务性的;
    如果数据库建完之后,业务不会经常变动,比较稳的,比较死的,可以使用业务主键;
    假如说业务经常变来变去的话,就使用代理主键,是不具有任何业务性的,仅仅是唯一的标识一条记录的;
     
    我们增加Studen的代码都是:
    public class StudentTest2 {
        public static void main(String[] args) {
            SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
            Session session = sessionFactory.openSession();    
            session.beginTransaction();    
            
            Student s = new Student();
            s.setName("张三");
            session.save(s);
            
            session.getTransaction().commit();    
            session.close();    
        }
    }
    View Code
     
    1)increment

    Student.hbm.xml:

    <hibernate-mapping package="com.cy.model">
        <class name="Student" table="t_student">
            <id name="id" column="stuId">
                <generator class="increment"></generator>
            </id>
            <property name="name"></property>
            
        </class>
    </hibernate-mapping>

    运行测试代码StudentTest2,发现建的表:

    保存发出的sql:

    2)identity

    建的表:

    保存发出的sql:

    3)sequcence

    mysql是不支持sequcence的,但是Oracle和DB2支持;

    4)hilo

    5)native

    mysql的native和identity是一样的;

    创建表和发出的sql步骤都和identity一样;不在演示

  • 相关阅读:
    win10 点击开始按钮无反应
    Server Error in '/' Application. IIS拒绝访问
    vs2017添加引用时报错未能正确加载“ReferenceManagerPackage”包。
    关于JavaScript中的this指向问题
    4p-在一张图片中根据矩形四个点的坐标计算两个矩形是否相交
    opencv使用
    [VMware]虚拟网络编辑器
    [所思所想]观《长津湖》有感
    [项目管理]失败的软件项目所具备的特点【待续】
    [软件过程/软件生命周期模型]软件过程的工具链【待续】
  • 原文地址:https://www.cnblogs.com/tenWood/p/7237394.html
Copyright © 2011-2022 走看看