• 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一样;不在演示

  • 相关阅读:
    清源CPM代码复现
    图像分类模型
    分享-微软亚洲研究院:NLP将迎来黄金十年
    表格生成本文-代码实践-data2text-plan-py
    了解一下BigBird
    《BERT模型精讲》徐路
    精读论文的步骤
    使用预训练编码器生成文本摘要
    Heap/Perm space
    静态代码块,代码块
  • 原文地址:https://www.cnblogs.com/tenWood/p/7237394.html
Copyright © 2020-2023  润新知