码迷,mamicode.com
首页 > Web开发 > 详细

Hibernate学习(三)

时间:2018-05-20 10:51:36      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:||   比较   内存地址   package   pen   false   ber   java   hashcode   

一、对象识别

  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学习(三)

标签:||   比较   内存地址   package   pen   false   ber   java   hashcode   

原文地址:https://www.cnblogs.com/RicardoWX/p/9062486.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!