如今,Hibernate正在迅速成为非常流行的(如果不是最流行的)J2EE O/R映射程序/数据集成框架。它为开发人员提供了处理企业中的关系数据库的整洁、简明且强大的工具。但如果外部需要访问这些已被包装在J2EE Web应用程序中的实体又该怎么办?是开发独立但相同的实体来访问数据,还是另外编写Web组件来管理内部访问的数据?
在某种程度上,这些问题是一定会发生的,对于我来说,当我的公司要向数据库中加载来自多个供应商的多种文件格式的记录时,就出现了这些问题。我考虑过以前常用的方法:用shell和SQL脚本(甚至存储过程)来加载数据。但由于数据模型过于复杂,我决定尽量利用现有的实体、Spring DAO以及Web应用程序之外的服务,并开发定制的J2SE命令行数据加载程序。
重要问题:我们是否应该这样做?
目前与Hibernate有关的大部分文档和例子都基于在容器中使用Hibernate。无论Hibernate是用于Web应用程序还是内部的“胖应用程序”,总是涉及到一个容器。这样做是有原因:容器支持各种特性,比如事务处理、线程和安全性。现在,要开发中型和企业应用程序,有一些工具是必需的。但当我们需要在容器外部访问实体对象时要怎么做?是使用现有的基础架构和代码呢,还是从另一种角度甚至还可能使用另一种语言去解决问题?当然,这个问题没有正确答案,在本文余下的部分中我将解释我所使用的方法,即,在Spring容器外重用现有的实体/POJO。
脚本语言(如:Perl、Python、Ruby,甚至是Tcl)乍一看都有一些优点。很多时候,脚本语言可以快速开发,并易于获得初始结果,它还可以绕过Hibernate底层的复杂性。有可能在短短数行内就连接到数据库、选择一些结果并将其打印到屏幕或某个日志文件中。但受数据模型的影响,事情可能(通常情况下都会)变得非常复杂。假设有一张person表,其中有一个到address表的外键,在插入数据时,address没有被正确插入,这会导致person也不能被插入:这是典型的事务问题。有人可能会辩解说在脚本语言中这个问题并不难解决,就像在主应用程序中所做的那样。但还是有问题存在:为什么要这样做?如果逻辑已经存在于应用程序中,为什么还要再次进行编码?而且这并不是唯一的问题,我们将需要复制工作和逻辑,还可能由此产生许多错误。
有些人可能认为这些都不是大问题,并用自认为是最合适的工具来解决这些问题。也许您已经由于编码之外的原因使用了某种独立的基础架构。也许您事先将数据上传到独立的数据库中并进行充分测试,然后再将数据迁移到生产数据库中。又或者您的数据库维护工作已经外包出去,您只需要将文件发送给合作伙伴公司,由他们来解决这些问题。最后,可能还有许多其他原因造成您并没有使用现有的Hibernate数据层——不管这些原因正确与否。但如果您可以并打算在应用程序之外使用现有的代码库,请继续往下读。我将介绍一些技巧,并解决一些令人头疼的问题。
配置
一旦决定在容器之外使用现有的Hibernate对象,那么首先就必须自己管理所有的配置。下文介绍的方法是使用一个独立的Java命令行应用程序。既然已经设置了Hibernate XML配置文件,那么您应该知道哪些参数是必需的,比如JNDI DataSource名称、实体映射文件以及用于记录SQL的各种属性。如果您决定使用命令行应用程序,那就一定要解决如何分析XML文件并把它添加到新配置中的问题。分析XML文档不是不可能的,但是这有时会带来一些其他的小任务。因此我建议使用常规的属性文件。属性文件的加载非常简单,而且从其中取值也很容易。下面的例子示范了配置Hibernate所需的最小属性集(没有任何实体映射)。
hibernate.dialect=net.sf.hibernate.dialect.PostgreSQLDialect hibernate.connection.driver_class=org.postgresql.Driver hibernate.connection.url=jdbc:postgresql://devserver/devdb hibernate.connection.username=dbuser hibernate.connection.password=dbpassword hibernate.query.substitutions yes 'Y'
正如您所看到的,上面的属性指定了数据库的非标准语言,JDBC驱动类、数据库服务器名称、用户名、密码以及是否使用查询替换。一旦定义这些属性并保存到hibernate.properties文件(应该在类路径下)中,就很容易加载它们并传递给Hibernate Configuration对象。
Properties props = new Properties(); try { props.load(props.getClass().getResourceAsStream("hibernate.properties")); }catch(Exception e){ System.out.println("Error loading hibernate "+"properties."); e.printStackTrace(); System.exit(0); } String driver = props.getProperty("hibernate.connection." + "driver_class"); String connUrl = props.getProperty("hibernate.connection.url"); String username = props.getProperty("hibernate.connection." + "username"); String password = props.getProperty("hibernate.connection.password"); // In my examples, I use Postgres, but Hibernate // supports virtually every popular dbms out there. Class.forName("org.postgresql.Driver"); Connection conn = DriverManager.getConnection(connUrl, username, password); Configuration cfg = new Configuration(); cfg.setProperties( props ); SessionFactory sessions = cfg.buildSessionFactory(); Session session = sessions.openSession(conn);
段代码描述了如何从hello包加载Message的实体定义。但这种方式只适用于某些情况,对大部分实体来说这样做是乏味且容易出错的,这些代码必须人工维护,每次增加新的实体都要更新加载程序代码 。真令人厌烦!有一种更容易的发现并加载这些映射的方法,可以使这些映射与.jar一样经常保持最新。 首先,正如在web应用程序或企业应用程序中一样,映射文件必须保存在类路径中,这样Hibernate才能正常工作。这是一件好事,因为只需使用同样的.jar文件并找到这些映射文件名。如果在类路径中有多个.jar文件,则需要指定哪个文件包含映射。下面的代码是寻找映射的方法之一。
相关推荐
在实际项目中,Hibernate通常作为数据访问层的一部分,与其他Java EE组件紧密结合,共同实现复杂的企业级应用。 - **与Servlets和JSP集成**:利用Servlets接收用户的HTTP请求,通过Hibernate处理业务逻辑,并最终...
Hibernate不仅负责将Java对象映射到关系数据库中,还能够处理应用程序中的数据持久化需求。 标题“hibernate中文参考文档”意味着该文档是一份面向中文用户的Hibernate框架的参考资料,旨在为开发者提供详细的技术...
在企业人事管理系统中,Hibernate负责将业务对象(如员工、部门等)映射到数据库表,通过HQL(Hibernate Query Language)或SQL语句进行数据查询和操作,减少了大量手动编写数据库操作代码的工作量。 Oracle数据库...
MySQL驱动是Java应用程序连接到MySQL数据库的关键组件,特别是在使用Hibernate和JPA这样的对象关系映射(ORM)框架时。这两个框架极大地简化了数据库操作,但它们依赖于合适的数据库驱动来建立连接。本篇文章将深入...
JavaSwing、Hibernate和Spring是Java开发中的三个关键组件,它们在构建用户界面、数据持久化和企业级应用架构方面发挥着重要作用。本项目结合这三个技术,创建了一个苹果风格的用户管理系统,对于学习和理解这些技术...
另外,方法引用和流API也是Java 8的重要特性,它们使得处理数据和并行计算变得更加直观和高效。 JDK 8u321作为维护更新版本,主要关注性能优化、安全修复和稳定性提升。这些更新对于保持应用程序的可靠性和安全性至...
在JavaSE环境中使用Hibernate JPA(Java Persistence API)进行数据持久化操作,需要引入一系列的jar包来构建完整的开发环境。这些jar包包含了对JPA规范的实现、Hibernate ORM框架的核心功能以及相关的依赖库。以下...
《Hibernate中文开发手册》是Java开发者的重要参考资料,它详尽地介绍了如何在Java应用程序中使用Hibernate框架进行对象关系映射(ORM)。Hibernate作为一款流行的开源ORM解决方案,极大地简化了数据库操作,使得...
Hibernate 是一个开源的Java语言下的对象关系映射(ORM)框架,它允许开发者用面向对象的方式来处理数据库操作,极大地简化了数据访问层的编码工作。在这个环境中,我们将探讨如何搭建一个基本的Hibernate项目,并...
在Java EE环境中,通常推荐使用JTA,而在Java SE环境中,JDBC事务管理更常见。 八、其他特性 - 支持懒加载(Lazy Loading):只有在真正需要数据时,才会去数据库加载关联的对象。 - 异步查询:使用Future或...
Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作与对象模型进行松耦合,使得在Java应用中处理数据库变得更加简单。本教程基于Hibernate4,是IT技术人员精心翻译的中文帮助文档,旨在...
在Java的持久化框架中,Hibernate是一个非常重要的组件,它为开发者提供了强大的对象关系映射(ORM)功能,使得在Java应用中操作数据库变得更加简单。本文将深入探讨Hibernate中的核心概念——Session管理。 首先,...
此外,为了使用Hibernate进行高效开发,需要对Java中的集合框架、泛型、异常处理、多线程等概念有深入理解。 文档中的描述提到,Hibernate从入门到精通,内容详细,文字清晰,值得一看。这表明文档不仅介绍了...
7. **多线程**: 在处理大量数据或执行耗时操作时,多线程可以提高应用性能。Java内置对多线程的良好支持,可以创建并发任务,如后台加载图书信息。 8. **设计原则与模式**: 项目可能遵循SOLID原则,利用工厂模式、...
下面将详细介绍Hibernate框架的核心组件、功能以及如何在项目中使用Hibernate的jar包。 1. Hibernate核心组件: - Hibernate Core:这是Hibernate的核心模块,包含了对持久化对象的基本支持,如Session接口、...
- Hibernate广泛应用于Java EE和Java SE应用程序中,用以实现数据持久化。 - 它提供了一种简单的方式去处理数据,使得开发者可以集中精力在业务逻辑上,而不需要过分关注数据操作细节。 - Hibernate还支持延迟加载和...
在4.5.1版本中,对JPA(Java Persistence API)的支持得到了强化,使得与Java EE和Java SE环境的集成更加顺畅。JPA是Java官方制定的ORM规范,而Hibernate是其最流行的实现之一。这个版本的Hibernate优化了实体管理...
Java SE 提供了基础的编程环境,包括核心类库,而 Java EE 则在 Java SE 的基础上增加了服务器端组件、Web 服务和分布式计算等功能。 ### Java 的特性 1. **面向对象**:Java 是一种面向对象的编程语言,它支持类...
- UnifiedEL:统一表达式语言,Hibernate Validator支持在表达式中使用校验注解。 - CDI:上下文依赖注入,Hibernate Validator可以与CDI无缝集成,便于在应用中管理校验器的生命周期。 - 安全管理器:可以在有...