Hibernate学习

Posted ricardowx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate学习相关的知识,希望对你有一定的参考价值。

一、对象识别

  1. 对数据库而言,其实别一条记录唯一性的方式是根据主键的值,如果手上有两条记录,他们拥有相同的主键值,则它们在数据库中代表同一个对象的记录

  2. 对于Java而言,要识别两个对象是否为同一个对象有两种方法

  • 内存地址识别(“==”)识别
  • 根据equals()、hasCode()中的定义

? (默认Object类中的equals(Object o)方法也是按内存地址来比较的),源码如下:

public boolean equales(Object obj){
    return (this == obj);
}

在Hibernate中,如果是在同一个Session中根据相同查询所得到的记录,则它们会拥有相同的Java识别。例:

 @Test
    public void test1(){
        Configuration configuration = new Configuration().configure();
        SessionFactory sessionFactory =  configuration.buildSessionFactory();
        Session session = sessionFactory.getCurrentSession();
        Transaction t = session.beginTransaction();
        Customer c1 = session.get(Customer.class,1);
        Customer c2 = session.get(Customer.class,1);
        System.out.println(c1 ==  c2);
    }

这个程序片段会显示true,标识c1和c2是同一个对象。

@Test
    public void test2(){
        Configuration configuration = new Configuration().configure();
        SessionFactory sessionFactory =  configuration.buildSessionFactory();
        Session session1 = sessionFactory.openSession();
        Transaction t = session1.beginTransaction();
        Customer c1 = session1.get(Customer.class,1);
        session1.close();
        Session session2 = sessionFactory.openSession();
        Transaction t2 = session2.beginTransaction();
        Customer c2 = session2.get(Customer.class,1);
        session2.close();
        System.out.println(c1 ==  c2);

    }

以上程序片段会显示false,说明了使用==来比较两个对象的记录是否代表数据库中的同一条记录是不可行的。如果您要有必要比较通过查询后两个对象的内容是否相同,必须重写 equals()与hashCode()。

重写的equals()和hashCode()代码如下:

package com.test.bean;

public class Customer {

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Customer customer = (Customer) o;

        if (!id.equals(customer.id)) return false;
        if (!name.equals(customer.name)) return false;
        if (!gender.equals(customer.gender)) return false;
        if (!age.equals(customer.age)) return false;
        return city.equals(customer.city);
    }

    @Override
    public int hashCode() {
        int result = id.hashCode();
        result = 31 * result + name.hashCode();
        result = 31 * result + gender.hashCode();
        result = 31 * result + age.hashCode();
        result = 31 * result + city.hashCode();
        return result;
    }
}

这个代码可以通过IDE自动生成,我们再来进行如下的测试:

@Test
    public void test3(){
        Configuration configuration = new Configuration().configure();
        SessionFactory sessionFactory =  configuration.buildSessionFactory();
        Session session1 = sessionFactory.openSession();
        Transaction t = session1.beginTransaction();
        Customer c1 = session1.get(Customer.class,1);
        session1.close();
        Session session2 = sessionFactory.openSession();
        Transaction t2 = session2.beginTransaction();
        Customer c2 = session2.get(Customer.class,1);
        session2.close();
        System.out.println(c1.equals(c2));
    }

这是返回的就是true了。

以上是关于Hibernate学习的主要内容,如果未能解决你的问题,请参考以下文章

如何学习hibernate源码

IOS开发-OC学习-常用功能代码片段整理

java SpringRetry学习的代码片段

python 机器学习有用的代码片段

学习笔记:python3,代码片段(2017)

学习 PyQt5。在我的代码片段中找不到错误 [关闭]