本文在
http://sarin.iteye.com/blog/603684和
http://sarin.iteye.com/blog/644678的基础之上继续研究,探究Java对象识别时的应用,并通过Hibernate来说明。
Java语言中判断对象是否相等有两种方式,一种是使用“==”来比较,一种是使用equals()方法来比较,前者是比较两个对象的引用地址是否相同,即两个引用地址是否指向同一个对象,而后者是比较对象的内容是否一致。
equals()方法是Object类中定义的方法,所有Java类都可以直接或间接继承这个方法,通过方法覆盖就可以实现自己的equals()方法,而这个方法的原始定义如下:
public boolean equals(Object obj){
return (this==obj);
}
可以看出,默认情况下“==”和equals()方法的比较原则是相同的,而Java类库中String,Date和基本类型的封装类都重写了该方法,所以它们有着自己的判断标准,即判断对象的内容是否相等。
在Hibernate中,对象识别是非常重要的一种开发手段,因为持久化对象对应了数据库表中的记录,为了区分表中的记录,我们使用主键来唯一标识,而对于持久化对象,我们使用了标识符。那么,为了比较对象是否相等,实质就是比较标识符属性是否一致。
首先,我们创建一个持久化类,如下:
public class User implements java.io.Serializable {
private Integer id;
// 省略其他属性
public User() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
// 省略其他getter和setter方法
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
@Override
public String toString() {
return "User [city=" + city + ", department=" + department
+ ", hireTime=" + hireTime + ", id=" + id + ", name=" + name
+ ", phone=" + phone + "]";
}
}
持久化类的其他属性参照toString()方法里的参数即可。我们使用Eclipse为我们自动生成了equals()方法,比较内容只是属性标识符(主键),因为持久化类对应数据库表中的记录,而记录由主键唯一标识,所以使用标识符属性来作为equals()方法比较的内容就最合适了。
在Hibernate中判断两个持久化对象是否相等,需要全面考虑,因为这里面的判断因素比较多。首先在相同的Session对象中,只要标识符属性值相同,那么两个持久化对象就相等,看下面的代码:
Session session = sessionFactory.getCurrentSession();
Transaction tx = session.beginTransaction();
User user1 = (User) session.get(User.class, new Integer(2));
User user2 = (User) session.get(User.class, new Integer(2));
tx.commit();
System.out.println(user1 == user2);
运行这段代码,得到true的结果,说明user1和user2两个引用指向了同一个对象,同时看到Hibernate执行这段代码的时候,只进行了一次数据库查询,说明第二个get()没有再次查找数据库,这就是Hibernate的缓存策略在起作用了。get()方法执行时会先在Hibernate的一级缓存中查找对象,没有找到才会查询数据库,而前面的一次查询,Hibernate将取出的对象放入了一级缓存中,所以第二个get()没有执行数据库操作,而是把user2的引用指向了第一个get()查询出的对象。所以user1==user2是成立的。
再看看不同Session的情况,因为Session对象在Hibernate中是一种生命周期较短的对象,一个应用不可能长时间使用同一个Session对象,所以要比较不同Session对象中的持久化对象是否相等,就需要比较标识符属性了,看下面的代码:
Session session = sessionFactory.getCurrentSession();
Transaction tx = session.beginTransaction();
User user1 = (User) session.get(User.class, new Integer(2));
tx.commit();
session = sessionFactory.getCurrentSession();
tx = session.beginTransaction();
User user2 = (User) session.get(User.class, new Integer(2));
tx.commit();
System.out.println(user1 == user2);
System.out.println(user1.getId().equals(user2.getId()));
随着commit()方法的调用,事务提交,Session对象关闭,那么两个持久化对象不属于同一个Session,所以当第二次获得Session时,Hibernate就又进行了一次数据库操作,所以两个对象是不同的,user1和user2的指向也是不同的,而它们都代表数据库表中的同一条记录么?就需要比较标识符的属性,而标识符的属性是相同的,所以equals()方法的判断就是正确的。而如果已经在持久化类中重写了equalse()方法,那么就可以如下书写:
System.out.println(user1.equals(user2));
得到的结果也是正确的,equals()方法的实现就是前面持久化类中的,而这个方法是可以借助Eclipse完成的,只需勾选需要比较的属性即可。
分享到:
相关推荐
它通过XML或注解的方式将Java对象映射到数据库表,使得数据库操作如同操作普通Java对象一样简单。Hibernate提供了CRUD(创建、读取、更新、删除)操作的API,以及查询语言HQL(Hibernate Query Language)和Criteria...
- Hibernate是一个强大的ORM(对象关系映射)框架,使得开发者可以用Java对象直接操作数据库,减少了SQL的编写。 - MyBatis作为轻量级的持久层框架,允许更灵活的SQL编写,同时保持了DAO模式的优点。 5. **Java ...
Hibernate作为ORM框架,它提供了一种在Java对象和数据库记录之间建立映射的方法。在Hibernate中,这个映射通常通过Hibernate配置文件(hbm.xml)或注解完成。映射文件定义了类与表、属性与列之间的对应关系,使得...
Hibernate是一种流行的Java对象关系映射(ORM)工具,它简化了Java应用程序与数据库之间的交互过程。通过Hibernate,开发者可以将Java对象映射到数据库表中,从而不必编写底层的SQL代码。Hibernate逍遥游记作为一本...
这个框架将数据库操作转化为对Java对象的操作,简化了数据持久化的复杂度。以下是对Hibernate的一些关键知识点的详细说明: 1. **异常处理**: 在描述中提到的`org.hibernate.PropertyValueException: not-null ...
### Spring+Struts+Hibernate应用知识点详解 #### 1. 概述 Spring、Struts 和 Hibernate 是 Java 开发领域非常流行的三个框架,它们分别在不同的层面提供了强大的支持:Spring 主要在 IoC 和 AOP 方面提供服务;...
Transient状态的实体对象与数据库无关,只是一个普通的Java对象。而Persistent状态的对象与数据库中的记录绑定,其变更会被Hibernate自动持久化。当Persistent状态的对象对应的Session关闭后,它进入Detached状态,...
正确配置这些参数是Hibernate应用成功运行的基础。 #### 提供JDBC连接 为了使Hibernate能够与数据库交互,需要在配置文件中提供JDBC连接信息,包括数据库URL、用户名、密码等。这些信息允许Hibernate创建数据库连接...
在IT领域,尤其是企业级应用开发中,ORM(对象关系映射)框架的应用极为广泛,而Hibernate作为Java平台下最受欢迎的ORM框架之一,提供了强大的功能来简化数据库操作。本文旨在深入探讨如何利用Hibernate框架访问...
1. Hibernate框架基础:介绍Hibernate的用途、优势以及它是如何与Java对象和数据库表进行映射的。 2. 开发环境搭建:如何安装和配置Hibernate以及相关的开发工具,比如IDE(集成开发环境)和数据库。 3. Hibernate...
Hibernate是一个流行的Java对象关系映射(ORM)框架,它简化了数据库操作,将Java对象与数据库表之间的映射过程自动化。而`hibernate-extensions-2.1.3.zip`则包含了一系列对Hibernate原生功能的扩展,这些扩展为...
在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作与业务逻辑解耦,通过面向对象的方式处理数据。本文将深入探讨如何使用Hibernate实现领域对象的自定义字段,这涉及到对...
1. Hibernate:Hibernate是一个流行的Java对象关系映射(ORM)框架,它允许开发人员使用面向对象的方式来操作数据库,而无需直接编写SQL语句。通过Hibernate,Java对象可以被透明地保存、更新、查询和删除,简化了...
【Hibernate雨夜的寂寞原创教程】是一份专为初学者设计的教程,旨在帮助学习者掌握Hibernate这一强大的Java对象关系映射(ORM)框架。Hibernate是Java开发中的一个热门工具,它极大地简化了数据库操作,使得开发者...
### Eclipse快速上手Hibernate之入门实例详解 #### 引言 ...掌握这些基本概念后,开发者可以进一步探索Hibernate的高级特性,如缓存机制、查询语言、事务管理等,以提高应用程序的性能和稳定性。
1. Hibernate概览:Hibernate是一个基于Java的ORM框架,它允许开发者通过Java对象来操作数据库,消除了SQL的繁琐工作。其核心组件包括Session、SessionFactory、Entity、Query等。 2. Hibernate配置:配置文件...
Hibernate则是一个对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。通过Hibernate,开发者可以用面向对象的方式来操作数据库,而无需直接编写SQL语句。在登录系统中,Hibernate可以用来存储和...
在开发基于Java的应用程序时,Hibernate作为一个强大的对象关系映射(ORM)框架被广泛采用。然而,在处理中文字符时,开发者可能会遇到各种各样的问题,如乱码显示等。本文将详细介绍如何解决Hibernate在处理中文...
Hibernate是一个流行的对象关系映射(ORM)框架,它允许开发者用面向对象的方式来处理数据库操作,而HibernateTools就是这个ORM框架的得力助手。 首先,我们来详细了解一下HibernateTools的主要功能。它包含多个...