`
sarin
  • 浏览: 1756731 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
E3b14d1f-4cc5-37dd-b820-b6af951740bc
Spring数据库访问系列...
浏览量:173642
C2083dc5-6474-39e2-993e-263652d27795
Android学习笔记
浏览量:368089
5f40a095-b33c-3e8e-8891-606fcf3b8d27
iBatis开发详解
浏览量:189239
B272a31d-e7bd-3eff-8cc4-c0624ee75fee
Objective-C学习...
浏览量:99815
社区版块
存档分类
最新评论

Java对象识别(Hibernate应用)

阅读更多
    本文在http://sarin.iteye.com/blog/603684http://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完成的,只需勾选需要比较的属性即可。
2
2
分享到:
评论
2 楼 sarin 2010-09-16  
chian_xxp 写道
多谢,似乎可以结合非主键、唯一性约束判断。谢谢。

主键约束要求唯一而且非空,唯一性约束可以为空。非主键如何唯一确定一条记录呢?
1 楼 chian_xxp 2010-09-16  
多谢,似乎可以结合非主键、唯一性约束判断。谢谢。

相关推荐

    Java常用架包struts,hibernate等

    它通过XML或注解的方式将Java对象映射到数据库表,使得数据库操作如同操作普通Java对象一样简单。Hibernate提供了CRUD(创建、读取、更新、删除)操作的API,以及查询语言HQL(Hibernate Query Language)和Criteria...

    Java Web之高级应用

    - Hibernate是一个强大的ORM(对象关系映射)框架,使得开发者可以用Java对象直接操作数据库,减少了SQL的编写。 - MyBatis作为轻量级的持久层框架,允许更灵活的SQL编写,同时保持了DAO模式的优点。 5. **Java ...

    1对象持久化与hibernate基础共48页.pdf.zi

    Hibernate作为ORM框架,它提供了一种在Java对象和数据库记录之间建立映射的方法。在Hibernate中,这个映射通常通过Hibernate配置文件(hbm.xml)或注解完成。映射文件定义了类与表、属性与列之间的对应关系,使得...

    Hibernate逍遥游记 .pdf

    Hibernate是一种流行的Java对象关系映射(ORM)工具,它简化了Java应用程序与数据库之间的交互过程。通过Hibernate,开发者可以将Java对象映射到数据库表中,从而不必编写底层的SQL代码。Hibernate逍遥游记作为一本...

    Hibernate,hibernate笔记

    这个框架将数据库操作转化为对Java对象的操作,简化了数据持久化的复杂度。以下是对Hibernate的一些关键知识点的详细说明: 1. **异常处理**: 在描述中提到的`org.hibernate.PropertyValueException: not-null ...

    Spring+Struts+Hibernate应用

    ### Spring+Struts+Hibernate应用知识点详解 #### 1. 概述 Spring、Struts 和 Hibernate 是 Java 开发领域非常流行的三个框架,它们分别在不同的层面提供了强大的支持:Spring 主要在 IoC 和 AOP 方面提供服务;...

    《深入浅出Hibernate》读书笔记

    Transient状态的实体对象与数据库无关,只是一个普通的Java对象。而Persistent状态的对象与数据库中的记录绑定,其变更会被Hibernate自动持久化。当Persistent状态的对象对应的Session关闭后,它进入Detached状态,...

    Hibernate电子书(全)

    正确配置这些参数是Hibernate应用成功运行的基础。 #### 提供JDBC连接 为了使Hibernate能够与数据库交互,需要在配置文件中提供JDBC连接信息,包括数据库URL、用户名、密码等。这些信息允许Hibernate创建数据库连接...

    hibernate对access支持

    在IT领域,尤其是企业级应用开发中,ORM(对象关系映射)框架的应用极为广泛,而Hibernate作为Java平台下最受欢迎的ORM框架之一,提供了强大的功能来简化数据库操作。本文旨在深入探讨如何利用Hibernate框架访问...

    hibernate3 中文参考手册

    1. Hibernate框架基础:介绍Hibernate的用途、优势以及它是如何与Java对象和数据库表进行映射的。 2. 开发环境搭建:如何安装和配置Hibernate以及相关的开发工具,比如IDE(集成开发环境)和数据库。 3. Hibernate...

    hibernate-extensions-2.1.3.zip ,middlegen for hibernate

    Hibernate是一个流行的Java对象关系映射(ORM)框架,它简化了数据库操作,将Java对象与数据库表之间的映射过程自动化。而`hibernate-extensions-2.1.3.zip`则包含了一系列对Hibernate原生功能的扩展,这些扩展为...

    用Hibernate实现领域对象的自定义字段

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作与业务逻辑解耦,通过面向对象的方式处理数据。本文将深入探讨如何使用Hibernate实现领域对象的自定义字段,这涉及到对...

    hibernate的所有必备jar包

    1. Hibernate:Hibernate是一个流行的Java对象关系映射(ORM)框架,它允许开发人员使用面向对象的方式来操作数据库,而无需直接编写SQL语句。通过Hibernate,Java对象可以被透明地保存、更新、查询和删除,简化了...

    [Hibernate雨夜的寂寞原创教程].Hibernate

    【Hibernate雨夜的寂寞原创教程】是一份专为初学者设计的教程,旨在帮助学习者掌握Hibernate这一强大的Java对象关系映射(ORM)框架。Hibernate是Java开发中的一个热门工具,它极大地简化了数据库操作,使得开发者...

    Eclipse快速上手Hibernate之入门实例

    ### Eclipse快速上手Hibernate之入门实例详解 #### 引言 ...掌握这些基本概念后,开发者可以进一步探索Hibernate的高级特性,如缓存机制、查询语言、事务管理等,以提高应用程序的性能和稳定性。

    hibernate_reference中文版和Hibernate中文手册

    1. Hibernate概览:Hibernate是一个基于Java的ORM框架,它允许开发者通过Java对象来操作数据库,消除了SQL的繁琐工作。其核心组件包括Session、SessionFactory、Entity、Query等。 2. Hibernate配置:配置文件...

    java开发Eclipse+struts+Hibernate制作图形验证码及登录视频

    Hibernate则是一个对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。通过Hibernate,开发者可以用面向对象的方式来操作数据库,而无需直接编写SQL语句。在登录系统中,Hibernate可以用来存储和...

    hibernate的中文问题的解决方案

    在开发基于Java的应用程序时,Hibernate作为一个强大的对象关系映射(ORM)框架被广泛采用。然而,在处理中文字符时,开发者可能会遇到各种各样的问题,如乱码显示等。本文将详细介绍如何解决Hibernate在处理中文...

    HibernateTools

    Hibernate是一个流行的对象关系映射(ORM)框架,它允许开发者用面向对象的方式来处理数据库操作,而HibernateTools就是这个ORM框架的得力助手。 首先,我们来详细了解一下HibernateTools的主要功能。它包含多个...

Global site tag (gtag.js) - Google Analytics