分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

Hibernate学习(三)

发布时间:2023-09-06 01:55责任编辑:蔡小小关键词: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学习(三)

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

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved