大约一年以前,我为了学习一些Hibernate
专业知识,因此我参加了一个Hibernate项目。从那时起,我一直在使用Hibernate框架下的JPA(Java持久API)实现,使用的思想仍就是一样的。那个项目使用了一个数据库
,
这个数据库规模有些大,略显落后,并且还被许多的应用程序共用。为了尽快加入到项目中,我开始学习一些Hibernate知识。从书本上的例子开始学习,
感觉很简单,学起来也很快,但是发现从零开始开发一个项目,并且控制它又是另外一回事了。试着在一个大型,复杂,被许多应用程序共用的数据库上使用
Hibernate就又完全不同了。弄清楚了我可能遭遇到的技术难点,我开始想别的招了,要尽快从另外的方向开始,克服困难。
在最终的学习和实践中,我发现我还是学到了许多重要的东西,虽然我们的项目还没有完全做完,但是我认为我们目前已经非常漂亮的应用了Hibernate/JPA的一些思想。现在我需要重新思考反省我所学到的东西,如下便是我学到的一些心得:
1)和数据库管理员
成为朋友
目前存在一个趋势,就是一些Java开发
者忽视数据库管理员的重要性。这便犯了一个很大的错误,对于要取得任何的ORM(对象关系映射)技术的成功,和数据库管理员保持一个良好的工作关系是至关重要的。有如下两个原因:
单独数据库管理员虽然不能使Hibernate项目成功,但是他们通常可以让这些项目失败。
数据库管理员对数据库本身具有很好的洞察力,很好的职业习惯,告诉你一些易犯的错误和操作建议。我能记起这样的很多例子,一个数据库管理员的建议节约了我们很多的时间和提供给我们一个很好的解决方案
。
在大多数情况下,拥有好的数据库管理员,并且和他们保持良好的关系对你ORM(对象关系映射)工作至关重要。
2)从一开始使用(最好强制使用)好的命名标准
我们知道对命名标准的讨论将会有争议的,但是我们必须明确一件事情,我们的命名要让我
们的数据模型有意义,这能让开发者使用起来简单,以免他们迷惑。所以,如何命名实体和属性是非常重要的。我有我喜欢命名标准,并且认为他们是最好的,但是
在这里我不想把他们强加于你们。最重要的是你自己做出决定使用什么样的命名标准,并且让所有人使用它。实际上,不仅仅命名标准需要统一,其它的也需要
(如,布尔型用“Y/N” 或者 0/1表示)。
3)不要试着映射所有的属性
我们总是设法使用工具,如Dali来映射所有的东西,然后形成一张表格(一些表格有上百列 !)。这最终会很麻烦。为什么?因为我们使用的是共用的,先前的
数据库
,有许多的字段是我们并不关心和从来不使用的。映射它们只会导致性能问题和造成混乱。
4)让数据库做自己擅长的工作
我们想有一个好的,清晰的数据模型,因此我们不惜任何代价写一些额外的查询语句来获取对象相关数据,要么使用
存储过程
,要么使用函数。这是做法是错误的,数据库优势在于存储,而不是保持
Hibernate
创
建或读写的数据。举个例子,我们有一个对象,与之相关联的有一个状态。这个状态在整个应用程序中都要用到,因此,它毫无疑问是要执行的,但是,我们不想每
次都要单独的写一个查询语句。这个问题在于,这个状态是从一些统计计算中派生出来的,并且这些统计计算需要用到一对多的关系。每次从加载的对象中读取数据
的代价是非常高的。后来跟我们其中的一位
数据库管理员
交流了一下,发现一个我们可以使用的sql函数能够很快的获得该状态。我们使用@Formula来映射成一个状态属性,就能得到我们所需要的所有东西。这仍就是域模型的一部分,但是执行起来非常好。有时像这样的一个折衷的办法能够起到很大的效果。
5)分解数据库
在一开始,我就想在Hibernate中模型化整个数据库。结果发现这是不切实际的,原因如下:
a) 这是一项巨大的工程,并且要花费几周的时间,而用户根本看不到你做了什么实际的工作。
b) 我不可能在第一次就把它弄好,后继的开发者无论如何都会修改它们的。
现在有一个趋势,就是希望在开始之前,将所有的事情都进行映射,但是,当时你开始这么做后,你不需在这上面花很多的时间。我后来发现一个好的办法,就是将数据库分解,工作的时候一块一块的进行,发现这很有帮助。
6)密切注意触发器
a) 在后台触发器很隐蔽的执行了一些功能,让你很是疑惑,不知道发生了什么。
b) 当你在
Hibernate
端需要复制一些东西的时候,触发器会做一些手脚。之前我们好几次没有认识到这个教训,导致我们丢失了很多数据,这些都是由触发器引起的,这几乎让我们很是郁闷。
7)避免使用工具来自动生成你的模型
没错,这些工具的使用可以节约时间(虽然我们发现了Dali有一个很严重的bug,但是我们还是使用它),但是最后你不得不重新做很多的事情。其实手动也花费不了你很多的时间,当你亲自做的时候,这可以让你有机会熟悉那些数据。
8) 尽量多的使用命名查询语句(NamedQueries)
虽然很容易写查询语句,但是在许多的情况下,使用NamedQueries会更好,这会有助于你完成两件事情:
a) 它能更加重用,因为被命名的查询语句通常在代码的重要地方。
b) 你的查询语句在开始的时候就是正确的,那么在查询语句中的错误更加容易发现。
要习惯这样做需要花一些时间,但是这么做是值得的。
9)预期管理
对于任何一种框架、技术、甚至观念来说,这是非常重要的,要铭记在心。由于某些原因,
人们倾向于专注某一个特征,这些特征实际上或许不存在,或许被夸大。有时它很小,很容易理解(举个例子,理解一些实际的工作,需要在Hibernate中
映射),有时我也不知道他们是如何管理实现一些概念(如Hibernate是如何管理计划修正的)。无论如何,找到预期目标是什么,然后管理它们是非常重
要的。如果你的团队认为Hibernate会使得
数据库管理员
没有用处,把他们解雇,那么你将会有一个潜在的问题存在。
10)使用富域模型(rich domain modeling)
我所遇到的一件很悲哀的事情,就是在域对象仅仅是一个简单的数据容器的时候,我要使用
Hibernate,而像Hibernate这样的工具让我们以面向对象的方式来使用数据。简单的映射数据只是让我们停留在中途。当我本能的想到使用富域
模型(rich domain modeling)的时候,我发现我们可以重用很多的代码,我们的其它层变得不那么混乱了,并且我们的代码更加容易测试。
<script type="text/javascript">
if (document.getElementById("ra").innerHTML == '' && document.getElementById("rp").innerHTML == '')
{
document.getElementById("rc").innerHTML = "";
}
</script>
分享到:
相关推荐
赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...
赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...
MySQL驱动是Java应用程序连接到MySQL数据库的关键组件,特别是在使用Hibernate和JPA这样的对象关系映射(ORM)框架时。这两个框架极大地简化了数据库操作,但它们依赖于合适的数据库驱动来建立连接。本篇文章将深入...
JPA是Java EE和Java SE环境中的一种ORM(Object-Relational Mapping)解决方案,旨在替代Hibernate等第三方库,提供更加标准化的持久化框架。 **JPA规范**定义了应用程序与数据库交互的一组接口和API,包括实体...
hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码 hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码
`hibernate-jpa-2.1-api-1.0.0.final.jar`是Hibernate对JPA 2.1规范的实现库,它使得开发者能够使用Hibernate的高效功能同时遵循JPA规范。 **1. Hibernate与JPA的关系** Hibernate最初作为一个独立的ORM框架,后来...
hibernate-jpa-2.0-api-1.0.1.Final-sources.jar hibernate jpa 源代码
在Java开发中,Hibernate和JPA(Java Persistence API)是两种广泛使用的对象关系映射(ORM)框架,它们简化了与数据库交互的过程,使开发者可以使用面向对象的方式来操作数据。本教程将介绍如何使用Hibernate和JPA...
hibernate-jpa-2.0-api-1.0.1.Final.jar
本篇文章将深入探讨Hibernate JPA的核心概念、主要功能及使用方法。 一、Hibernate JPA基础 1. **实体(Entity)**:在Hibernate JPA中,实体是数据库表的映射,通过@Entity注解标识,每个实体类对应数据库中的一...
使用Hibernate JPA,开发者可以利用注解驱动的编程模型,减少代码量,同时通过ORM机制,使得业务逻辑和数据访问层更加分离,提高了代码的可读性和可维护性。然而,需要注意的是,虽然ORM工具带来了便利,但也可能...
《深入理解Hibernate-JPA 2.1 API:源码解析与应用实践》 在Java世界里,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。而Hibernate对Java Persistence API (JPA) 的支持,使得开发者...
如果在使用过程中没有报找不到JPA配置文件的错误,说明配置文件的位置和内容是正确的,且被成功读取。 **3. Hibernate-JPA的使用:** - **实体类(Entity):** 定义了与数据库表对应的Java类,通常使用`@Entity`...
在本文中,我们将探讨如何将Hibernate与Java Persistence API (JPA) 结合使用。首先,我们需要了解JPA的基本概念。 **1. 什么是JPA?** Java Persistence API (JPA) 是Java平台上的一个标准接口,它定义了用来管理...
- **数据访问对象(DAO)**:创建DAO层,使用Hibernate JPA提供的API进行数据操作,如`EntityManager`和`EntityManagerFactory`。 - **事务管理**:使用`@Transactional`注解进行事务控制,确保数据的一致性。 - *...
在Java世界中,Hibernate和Java Persistence API (JPA) 是两个强大的对象关系映射(ORM)框架,它们简化了数据库操作,使得开发者可以使用面向对象的方式处理数据。本篇文章将深入探讨Hibernate JPA入门案例所需的...
虽然Hibernate和JPA通常可以与多种数据库配合使用,但这个驱动特定于微软的SQL Server,如果你的项目依赖于这个数据库,那么这个驱动是必需的。 在使用这些库进行开发时,开发者需要配置相应的Hibernate和JPA设置,...
内容概要:本文档全面介绍了JavaWeb开发中的几个关键技术,包括Servlet与JSP的基础与深入分析,Spring MVC框架的解析与应用,以及JPA与Hibernate的结合使用。每个部分不仅阐述了技术的基本概念和工作原理,还涵盖了...
在IT行业中,构建一个基于Spring、SpringMVC、Hibernate和JPA的开发环境是常见的任务,这四个组件都是Java企业级应用开发中的重要工具。让我们深入探讨这些技术以及如何将它们整合在一起搭建一个完整的开发环境。 *...