hibernate.docx
- 文档编号:29249549
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:15
- 大小:347.03KB
hibernate.docx
《hibernate.docx》由会员分享,可在线阅读,更多相关《hibernate.docx(15页珍藏版)》请在冰豆网上搜索。
hibernate
Hibernate入门指南
内容表
前言
1.获取Hibernate
1.1Hibernate模块/构件
1.2发布包下载
1.3Maven库产物
2.使用原生HibernateAPIs和hbm.xml映射教程
2.1Hibernate配置文件
2.2实体Java类
2.3映射文件
2.4示例代码
2.5更进一步
3.使用原生HibernateAPIs和注解映射教程
3.1Hibernate配置文件
3.2带注解的实体Java类
3.3示例代码
3.4更进一步
4.使用Java持久化API(JPA)教程
4.1persistence.xml
4.2带注解的实体Java类
4.3示例代码
4.4更进一步
5.使用Envers教程
5.1persistence.xml
5.2带注解的实体Java类
5.3示例代码
5.4更进一步
前言
使用面向对象软件和关系数据库是比较繁琐和费时的。
由于数据如何在对象与关系数据库中表现的模式不匹配,导致开发成本高得很。
Hibernate是Java环境中的一个对象/关系映射解决方案。
对象/关系映射这个术语指的是一个对象模型表示与一个关系数据模型表示间的数据映射技巧。
查看http:
//en.wikipedia.org/wiki/Object-relational_mapping来获得更高层次的讨论。
当然,看看MartinFowler的文章OrmHate也能获得更多不匹配的问题。
尽管使用Hibernate不需要强大的SQL背景,但是,对那些概念有一个基本的理解可以帮助你更快更全面的理解Hibernate。
理解数据建模原则也是很重要的。
http:
//www.agiledata.org/essays/dataModeling101.html和http:
//en.wikipedia.org/wiki/Data_modeling对理解这些数据建模原则都是好的起点。
Hibernate关注从Java类到数据库表,从Java数据类型到SQL数据类型的映射。
此外,它还提供了数据查询和检索设施。
它显著地减少了开发时间,否则将要用SQL和JDBC来手动处理数据。
Hibernate的设计目标是通过消除需要使用SQL和JDBC进行手动,手工处理数据的需求来缓解开发人员在95%常用数据持久化的相关编程任务方面的压力。
但是,不像许多其他持久化解决方案,Hibernate并没有隐藏SQL的力量,并保证你在相关的技术和知识中的投入也是有用的。
Hibernate可能不是仅使用存储过程来实现数据库业务逻辑的以数据为中心的应用的最好解决方案,但它却对基于Java的中间层中的面向对象域模型和业务逻辑非常有用。
但是,Hibernate肯定能帮你消除或者封装供应商特定的SQL代码并简化要翻译从一个表格表示到一个图形对象的结果集的常用任务。
查看http:
//hibernate.org/orm/contribute/来获得有关参与的信息。
注意:
本指南中引用的教程的项目和代码由hibernate-tutorials.zip提供。
1.获取Hibernate
1.1Hibernate模型/构件
Hibernate的功能被分成一系列模块/构件,意味着要独立去依赖(模块化)
hibernate-core
主要(核心)的Hibernate模块。
定义了它的ORM特征和APIs以及各种集成的SPIs
Hibernate-entitymanager
定义Hibernate的JPA支持
Hibernate-java8
支持使用Java8特定的数据类型,例如在域模型中的任意的JSR310日期/时间类型。
Hibernate-envers
Hibernate的历史实体版本特征
Hibernate-spatial
Hibernate的空间/地理信息系统GIS数据类型的支持
Hibernate-osgi
Hibernate支持运行在OSGI(openservicesgatewayinitiative动态模块化系统)的容器
Hibernate-c3p0
集成C3P0连接池库到Hibernate中
Hibernate-hikaricp(JDBC连接池组件)
集成HikariCP连接池库到Hibernate中
Hibernate-proxool
集成Proxool连接池库到Hibernate中
Hibernate-ecache(纯JAVA的进程缓存框架)
集成Ehcache缓存库到Hibernate中来作为二级缓存提供者
Hibernate-infinispan
集成Infinispan缓存库到Hibernate中来作为二级缓存提供者
1.2发布包下载
Hibernate团队在SourceForge文件发布系统提供发布包,有TGZ和ZIP格式。
每一个发布包包含JAR文件,文档,源代码和其他精华
你可以从
Lib/required文件夹,包含hibernate-core包和所有它的依赖。
不管使用Hibernate的哪一个特征,在你的类路径中,所有这些包都是必须的。
Lib/jpa文件夹,包含Hibernate-entitymanager包和所有它的依赖(除了在lib/required中的)
Lib/java8文件夹,包含hibernate-java8包和所有它的依赖(除了在lib/required中的)
Lib/envers文件夹,包含hibernate-envers包和所有它的依赖(除了在lib/required和lib/jpa中的)
Lib/spatial文件夹,包含hibernate-spatial包和所有它的依赖(除了在lib/required中的)
Lib/osgi文件夹,包含hibernate-osgi包和所有它的依赖(除了在lib/required和lib/jpa中的)
Lib/optional文件夹,包含由Hibernate提供的各种连接池和二级缓存集成所需要的包以及它们的依赖。
1.3Maven库产物
Hibernate产物的权威库是JBossMaven库。
Hibernate产物被同步到Maven中央作为自动工化工作的一部分(一些小的依赖可能会发生)。
负责JBossMaven库的团队维持一系列Wiki网页,这些网页包含了重要的信息:
https:
//developer.jboss.org/wiki/MavenRepositoryOrganization-关于库的常用信息
https:
//developer.jboss.org/wiki/MavenGettingStarted-Developers-为了做关于JBoss项目本身的开发工作而建立的JBoss库的信息
https:
//developer.jboss.org/wiki/MavenGettingStarted-Users-关于建立库的访问来使用JBoss项目作为你自己软件的一部分的信息
HibernateORM产物被发布在org.hibernategroupId
2.使用原生HibernateAPIS和hbm.xml映射教程
这个教程在下载包中的basic/
目标
HibernateSessionFactory引导程序
使用Hibernate映射文件(hbm.xml)来提供映射信息
使用Hibernate原生APIs
2.1Hibernate配置文件
关于这个教程,hibernate.cfg.xml文件定义了Hibernate的配置信息
Connection.driver_class,connection.url,connection.username和connection.password
这个教程使用了H2内存数据库,所以这些属性值都是针对H2的内存模式。
Connection.pool_size被用来配置Hibernate的内置连接池中的连接数。
注意:
内置的Hibernate连接池不用于生产使用,它缺少一些生产就绪的连接池的一些特征。
Dialect属性指定特定的SQL变量,这样Hibernate就会交谈。
提示:
在大多数情况下,Hibernate能够恰当的决定使用哪一种方言,这是特别有用的,如果你的应用程序面对多个数据库。
Hbm2ddl.auto属性能够使数据库自动生成模式直接进入到数据库。
最后,添加持久化类的映射文件到配置中。
这里有很多方法和选择去开启一个HibernateSessionFactory.关于其他信息,查看NativeBootstrappingtopicalguide.
2.2实体Java类
这个教程的实体类是org.hibernate.tutorial.hbm.Event
关于实体的笔记
这个类对getter和setter方法属性使用了标准的JavaBean命名规范,对字段使用了private可见性.虽然这个不是推荐的设计,也不是需要的。
无参构造方法也是JavaBean的规范,所有持久类都需要这样。
Hibernate使用Java反射来为你创建对象。
这个构造器可以是private.但是,运行时代理生成和没有byteCodeinstrumentation的高效数据检索需要package或public可见性。
2.3映射文件
这个教程的映射文件是类路径下资源中的org/hibernate/tutorial/hbm/Event.hbm.xml(如上面所讨论的,用了mapping加载到了类路径下)
Hibernate使用映射单元来决定如何去加载和存储持久化类对象。
Hibernate的映射文件是一种为Hibernate提供映射单元的选择。
例1.映射元素class
映射元素class的功能
Name属性(结合所包含的
Table属性命名了包含这个实体的数据的数据库表。
Event类的实例现在被映射到EVENTS数据库表的行中。
例2.映射元素id
Hibernate使用
注意:
id元素映射到表的实际主键列是不需要的,但是却是标准的规范。
Hibernate中映射的表甚至不需要定义主键。
但是,强烈推荐所有的模式都定义适当的引用完整性。
因此在整个hibernate文档中id和主键被交替使用。
这里的
它也定义了Event类的id属性作为包含标识值的属性。
Generator元素告知Hibernate使用哪一种策略来生成这个实体的主键值。
这个例子使用了一个简单的递增计数。
例3.映射元素property
两个
date和title.data属性映射包括column属性,但是title没有包括。
缺少column属性,Hibernate使用属性名作为列名。
这个适合title,但由于date是大多数数据库的保留字,你需要给这个列名指定一个非保留词。
这个title映射也缺少一个type属性。
在映射文件中声明和使用的type既不是Java数据类型也不是SQL数据库类型。
相反,它们是Hibernate的映射类型,是转换Java和SQL数据类型的转换器。
如果在映射中没有指定type属性,Hibernate通过使用Java反射来决定所声明的属性的Javatype以及给那个Javatype使用一个默认的映射type,自主地尝试着去决定正确的转换和映射类型。
在某些情况下,这种自动检测可能不会选择你所期待或需要的默认值,就像所看到的date属性,Hibernate不知道这个类型为java.util.Date的属性应该是映射到SQLDATE,TIME还是TIMESTAMP数据类型。
完整的日期和时间信息是通过将属性映射到时间戳转换器来保存,它标识了转换器类org.hibernate.type.TypestampType.
注意:
当处理映射文件时,Hibernate通过使用反射来决定映射类型。
这个过程增加了时间和资源开销。
如果启动性能是很重要的,要考虑显示的定义所使用的type.
2.4示例代码
Org.hibernate.tutorial.hbm.NativeApiIllustrationTest类演示了使用Hibernate的原生API.
注意:
为了方便使用,这些教程的例子以JUnit测试的方式给予呈现。
这种方法的一个好处就是setUp和tearDown方法大概的演示了org.hibernate.SessionFactory是如何在应用程序启动时被创建以及如何在应用程序生命周期结束时被关闭的。
例4.获取org.hibernate.SessionFactory
setUp方法首先创建了一个org.hibernate.boot.registry.StandardServiceRegistry实例,为了使用SessionFactory,它把配置信息包含到一组服务中去。
在这个教程中,我们在hibernate.cfg.xml中定义了所有的配置信息,所以在这里看不到有趣的。
使用StandardServiceRegistry,我们创建了org.hibernate.boot.MetadataSource.它是把你的域模型告诉Hibernate的起始点。
再次,因为我们在hibernate.cfg.xml中定义了,所以在这里看不到有趣的。
Org.hibernate.boot.Metadata代表了SessionFactory所基于的应用域模型的完整,部分被验证的视图。
引导程序过程中的最后一步是去创建SessionFactory.SessionFactory是线性安全对象,在整个应用中它被初始化一次。
SessionFactory作为org.hibernate.Session实例的工厂,它应该被认为是一个“工作单元”的必然结果。
例5.保存实体
testBasicUsage()方法首先创建一些新的Event对象,并把它们交给Hibernate去使用save()方法来管理。
Hibernate现在负责为每一个Event执行数据库的INSERT。
例6.获取实体列表
在这里我们看到一个例子,通过生成恰当的SELECTSQL,把它们发送到数据库,并用结果集数据来填充Event对象,HQL(HibernateQueryLanguage)从数据库中加载了所有已经存在的Event对象。
2.5更进一步
练习
重新配置这个例子来连接你自己的持久化相关联的数据库。
向Event实体添加一个关联来模拟信息线程。
3.使用原生HibernateAPIs和注解映射教程
这个教程在下载包中的annotations/
目标
一个HibernateSessionFactory的引导程序
使用注解来提供映射信息
使用Hibernate的原生APIs
3.1Hibernate配置文件
这个内容跟前面的配置相同,有一个不同是,在最后的
3.2注解实体Java类
在这个教程中的实体类是org.hibernate.tutorial.annotations.Event,它遵循JavaBean规范。
事实上,这个类跟前面的是相同的,除了这些,注解是用来提供元素据的,而不是一个分离的映射文件。
例7.标识一个类为实体
@javax.persistence.Entity注解被用来把一个类标为一个实体。
它的功能跟前面讨论的映射文件中的
另外,@javax.persistence.Table注解明显的指定了一个表名。
没有这个指定,默认的表明将会是EVENT.
例8.标识一个id属性
@javax.persistence.Id标记的属性定义了实体的id
@javax.persistence.GeneratedValue和@org.hibernate.annotations.GenericGenerator一前一后指出了Hibernate应该使用Hibernate的increment生成策略来作为这个实体的id值.
例9.标识直奔属性
正如在< 当通过注解来映射时,一个实体的属性被认为默认持久化,这就是为什么我们没有看到title携带任何映射信息。 3.3示例代码 Org.hibernate.tutorial.annotations.AnnotationsIllustrationsTest本质上是与前面讨论的org.hibernate.tutorial.hbm.NativeApiIllustrationsTest示例代码是一样的。 3.4更进一步 练习 向Event实体添加一个关联来模拟信息线程。 使用开发者指南作为向导 当一个Event被创建,更新或者删除时,添加一个回调来接收通知。 用事件监听来做同样的尝试。 使用开发者指南作为向导。 4使用Java持久化API(JPA)教程 这个教程在下载包中的entitymanager/ 目标 JPAEntityManagerFactory的引导程序 使用注解来提供映射信息 使用JPA的API调用 4.1persistence.xml 先前的教程使用了Hibernate特定的配置文件hibernate-cfg-xml.但是JPA使用它自己的配置文件persistence.xml来定义不同的引导程序过程。 这个引导过程是由JPA规范定义的。 在JAVASE环境中,持久化提供者(这个例子中的Hibernate)必须通过路径查找这个META-INF/persistence.xml的资源名称来定位所有的配置文件。 例10persistence.xml Persistence.xml文件应该给每一个”persistenceunit”提供一个独一无二的的名称。 当获得一个”javax.persitence.EntityManagerFactory”引用时,应用程序使用这个名字来引用配置。 当有必要的时候,这里的javax.persistence前缀变量会使用到。 注意,Hibernate特定的配置设置名称现在是hiberante的前缀。 4.2注解实体Java类 这个实体完全跟前面的注解实体Java类一样 4.3示例代码 先前的教程使用了Hibernate原生的API,这个教程使用了JPA的APIs 例11获取java.persitence.EntityManagerFactory 再一次注意,persistenceunit的名称是org.hibernate.tutorial.jpa,跟persistence.xml中的匹配。 例12saving(persisting)实体 这个代码跟前面的保存实体是一样的。 使用Javax.persitence.EntityManger接口而不是org.hibernate.Session接口。 JPA调用”persist”操作而不是”save”. 例13.获取实体列表 再次,这个代码与我们前面看到的获取实体列表是非常相似的。 4.4更进一步 练习 开发一个EJB会话bean来使用容器管理持久化上下文的意义。 尝试无状态和有状态的用例。 使用监听和基于CDI的注射来开发一个基于JMS时间的消息中心。 5.使用Envers教程 这个教程在下载包中的envers/ 目标 注解一个实体作为历史 配置Envers 使用EnversAPIs来查看和分析历史数据 5.1persistence.xml 这个文件跟前面讨论的JPA教程中的persistence.xml基本上一样。 5.2注解实体Java类 再次,这个实体与前面的注解实体Java类在很大程度上一样。 最大的不同是额外的注解@org.hibernate.envers.Audited,它告诉Envers自动去跟踪这个实体的变化。 5.3示例代码 这个代码保存了一些实体,改变其中的一个实体,然后使用EnversAPI去取回最初的版本以及更新后的版本,一个版本指的是一个实体的历史快照。 例14.使用org.hibernate.envers.AuditReader 我们看到一个org.hibernate.envers.AuditReader是从org.hiberante.envers.AuditReaderFactory中获取的,它也包含javax.persistence.EntityManager. 下一步,find方法检索指定版本的实体。 第一个调用是指查找id为2的版本为1的实体。 第二个调用是指查找id为2的版本为2的实体。 5.4更进一步 练习 提供一个自定义的版本实体来额外捕获谁使它改变了 写一个查询来检索符合某些标准的历史数据,使用”使用指南”来查看怎样去构建一个Envers查询 尝试有各种形式关系的auditing实体(多对一,多对多等),尝试去检索这样的实体的历史版本并导航对象树。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- hibernate