Hibernate5用户手册中文版

c#小王子 c#小王子 2021-11-11 1547 Java


Hibernate5用户手册中文版




第1章. Architecture(体系架构)


目录


1.1. 概述


1.2.Contextual sessions (session 上下文)


1.1. 概述


Hibernate 作为一个 ORM 解决方案,实际上位于 java 应用与关系数据库之间。 可以参考上图所示。JAVA 应用使用 Hibernate API 加载、存储、查询等操作, 处理数据库中的数据。这里先简单介绍一下基本的 Hibernate API,稍后我们 再讨论它的细节。


SessionFactory(会话工厂)(org.hibernate.SessionFactory) 它是一个线程安全的,immutable(终态的),它是一个代理,表示应用程序域

模型到数据库的映射,作为建立 org.hibernate.Session(会话实例)的工厂。


SessionFactory 的建立代价很大(译者注:内存、cpu 占用很大),所以一个 应用只能有一个 SessionFactory。SessionFactory 维护 Hibernate 的所有 Session(会话),二级缓冲,连接池,事务等等。


Session(会话)(org.hibernate.Session)


Session(会话)是一个单线程,短生命周期的对象,是按"Unit of Work(工 作单元)"[PoEAA]模式的概念构建的。


封装了 JBDC 的连接对象 java.sql.Connection。作为一个 org.hibernate.Transaction(事务)实例的工厂,维护应用程序 domain model(数据模型、域模型)中通用("repeatable read 可重复读取")的持久 化内容(一级缓冲)。


Transaction(事务)(org.hibernate.Transaction) 它是单线程,短生命周期的对象,它用于界定具体物理事务的范围。它作为一 个抽象 API 接口用于隔离各种应用与底层的事务系统(JDBC, JTA, CORBA……)。


1.2. Contextual sessions(session 上下文)


大多数应用程序使用 Hibernate 时需要某种形式的 session“上下文”,一个 特定的 session(会话)影响整体特定的上下文范围。然而,跨应用程序的组建 上下文是很难的;目前的观点是:不同的上下文定义了不同的范围。在 Hibernate3 以前,应用程序使用 session 有两种方式:一种是利用

ThreadLocal(本地线程)加上辅助类如:HibernateUtil,建立 session(会 话);另一种是使用第三方框架,如:Spring、Pico,它们提供基于上下文 的,session(会话)的代理/拦截。 从 Hibernate3.0.1 版开始,加 Sessionfactory.getcurrentsession()方法。 最初此方法使用 JTA 的事务处理。在 JTA 自己的范围中与当前会话中一起使用。 由此可以使用很成熟的 JTA TransactionManager(JTA 事务管理)实现。但是这要求所有应用程序都用 JTA 事务管理,不管这个应用程序是否部署在 J2EE 容器中,你的 session 一定要使用基于 JTA 的上下文。 然而,从 Hibernate3.1 以后,SessionFactory.getCurrentSession()可以变成 插件式的,为此一个新的扩展接口 org.hibernate.context.spi.CurrentSessionContext 与一个新的配置参数 hibernate.current_session_context_class 产生了,通过这一变化,允许定义可插拔的上下文范围与当前会话。


参考 JAVA 文档中 org.hibernate.context.spi.CurrentSessionContext 接口, 其中详细讨论了这一约定。接口定义了唯一方法 currentSession(),这个方法的实现类可以跟踪当前会话的上下文。在外部 Hibernate 允许用三种方法来实现这一接口:


org.hibernate.context.internal.JTASessionContext:由 JTA 事务界定当前会话范围与跟踪当前会话。这种处理方式与原来版本是完全一样。详情见

javadocs。 org.hibernate.context.internal.ThreadLocalSessionContext:由执行的线程跟踪当前会话。详情见 javadocs。


org.hibernate.context.internal.ManagedSessionContext:由执行的线程跟踪 当前会话。然而你自己负责绑定与解绑 Session(会话)实例,这些通常在类的静态方法中,这时 Session(会话)不能打开,关闭,刷新,详情见 javadocs。


通常,这个参数的值将被命名为使用的实现类。当通过外部插件来实现,这些要分别要对应三个短语:"jta","thread","managed"。 前两种实现都提供了“one session - one database transaction(一会话,一事务)”开发模式。这也可以称为“session-per-request(每请求一会话)”模式。开 始结束一个 Hibernate 会话都是在数据库事务过程中定义的。如果计划使用经典的 JSE 平台的事务处理流程,而不使用 JTA 事务,建议在你的代码中用 hibernateTransaction(事务)API 来代替系统底层的事务过程。如果你使用 JTA,你可以利用 JTA 接口来定义事务。如果你运行在支持 CMT 的 EJB 容器中, 事务以声明的方式定义,你的代码中将不用处理事务与会话的操作。参考第 6 章,

事务与并发控制有更多的信息与代码示例。 hibernate.current_session_context_class 配置参数为org.hibernate.context.spi.CurrentSessionContext。为了向后兼容,如果没有设定此参数,但是

org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform 被设定, hibernate 将使用 org.hibernate.context.internal.JTASessionContext。


第 2 章. Domain Model(域模型)


目录


2.1. POJO 模型(POJO Domain Models)

2.1.1. 实现无参构造

2.1.2. 提供标识(

identifier)属性

2.1.3. 使用非 final 类

2.1.4. 为持久化属性声明 get,set 方法

2.1.5. 实现 equals()与 hashCode()

2.2. Dynamic(动态)模型术语 domain model(域模型)来自于 data modeling(数据建模)范畴。这 个模型最终描述的是你要解决的 problem domain(问题域)。有时你听说过 术语"持久化类(persistent classes)"。 归根结底,应用程序的 domain model(域模型)是实体关系模型(ORM)中的 核心角色。他拼装你想要 map(映射)的类。Hibernate 可以非常好的工作于 POJO(Plain Old Java Object)或者 JavaBean 开发模式中。然而,这些规范 都不是强制要求。事实上,Hibernate 没在限制持久层对象的特质。你可以用 其它方式表示 domain model(域模型)(比如用 java.util.Map 的树状实例)。


注意


尽管 Hibernate 没有将这些规范看作是强制要求,但是 JPA 是要求的。因此如 果你的应用有向 JPA 移植的可能性,你最好遵守严格的 POJO 模型。我们将指 出在哪里涉及到这些问题。


本章将阐述 domain model(域模型)的特征,然而,不讨论 domain model(域 模型)的全部内容。这是一个巨大的主题,它有自己的专用手册。参考 Hibernate Domain Model Mapping Guide(域模型映射手册)hibernate 文档页.


2.1. POJO 模型

本节探讨定义为 POJO 的域模型


2.1.1. 实现无参构造函数

POJO 要求实现一个无参构造函数,Hibernate 与 JPA 都要求这样。 JPA 要求这个构造函数声明为 public 或者 protected。Hibernate 大多数情况

下只关心可见性,只要系统的安全机制允许重写可见性就可以。这意思是说, 如果你想支持运行时代理生成类,这个构造函数应该声明最小包可见(译者注: 默认作用域)。


2.1.2. 提供 identifier(标识)属性

注意


以前这被认为是可选的。然而在实体上不定义主键将被认为是过时的。在未来 的版本中,将强制要求定义标识属性。 标识属性不一指要求是物理映射定义的主键列。然而,它一定映射到可以唯一 标识一行的列上(译者注:唯一标识列)。 我们建议你在持久化类中声明一个统一命名的标识属性,你可以使用 nullable (可空的)类型(即:非 JAVA 基本数据类型)。


2.1.3. 使用非 final 类


Hibernate 核心功能是通过运行时代理可以懒加载(lazy load)实体数据。这 个功能依赖于实体类是非终态类(final)或者 实现一个声明过所有属性 get 与 set 方法的接口。你可以坚持用终态类(final)并且不实现接口。但是你将不能使用代理进行懒加载关联抓取,并且这将限制你系统的优化选项。


注意


从 Hibernate5.0 开始,我们提供了一个强大的全新的字节码处理器,用于处 理懒加载。以前版本的 hibernate 中只有一个简单的字节码重写功能。 你也应该避免持久化属性的 get,set 方法为终态的(fianl)的,原因上面已经说 过了。


2.1.4. 为持久化属性声明 get,set 方法


虽然不是必须的,我们建议你遵守 JavaBean 规范来声明实体持久化属性的 get,set 方法。虽然 Hibernate 是可以直接访问实体的成员变量(field)。 这此属性(成员变量,set,get 方法)不一定声明为 public。Hibernate 可以 处理各种可见性(public, protected, package(译者注:默认属 性),private)的属性。


2.1.5. 实现 equals()与 hashCode()方法


注意


本节大部分内容讨论处理 Hibernate 会话(session)与实体的关系;如果你不熟悉实体的三种状态:manged(托管态)(译者注:原来叫 Persistent 持久态,这次改名了,还是有什么变化?),transient(瞬时态、临时态),detached (脱管态、分离态),请参考这里

在域模型中是否实现 equals()与 hashCode()方法,如何实现他们。这一切在 ORM 中都是一个复杂的问题。


一般作为类中的标识类型,在其 id 值上必须实现 equals/hashCode 方法。有两种情况不一定要实现 equals/hashCode 方法,一是:当用户类使用联合主键时;二是:下面讨论的一些特殊情况。用户定义的类使用了复合键使用这种类用作定义用户类型的复合主键。除了以上这种情况以及下面讨论的很少一些情况下,你不必一定实现 equals/hashCode 方法。


那么,有什么烦恼?通常情况下,大多数的 Java 对象在其的标识属性上提供 一个内置的 equals()和 hashCode()方法,因此,每个新的对象与其他对象 不同。这通常是我们在普通的 Java 编程所要做的。然而,事实上当我们从数据 库中取得数据时,很可能出现多个实例有相同的值。这时你应该开始考虑重定义内置的 equals()和 hashCode()方法。每次从数据库中加载一个特定下面代码的 Person 类,我们自然将得到唯一的实例。Hibernate 努力确保在一个会话中不发生这样的情况(译者注,多次加载同一行数据,对象应该是一个)。事实上,Hibernate 在一个特定内部会话中保证数据行的 ID 与 JAVA 的 ID 对等的关系。因此如果你在一个会话中请求一个特定对象多次,事实上你将得到同一个实例:


【下载地址】

百度网盘链接:https://pan.baidu.com/s/13-Ul5459EH6zc2eOvEpiMQ

提取码:qs1n


相关文章


使用-JFreeChart来创建基于web的图表

使用-JFreeChart来创建基于web的图表

XStream使用文档

XStream使用文档

WebService发布过程及常见问题

WebService发布过程及常见问题

webpack实战入门进阶调优分享

webpack实战入门进阶调优分享

weblogic调优参数及监控指标

weblogic调优参数及监控指标

weblogic节点管理

weblogic节点管理

weblogic管理控制台概述

weblogic管理控制台概述

weblogic-部署和启动

weblogic-部署和启动

WebLogic-Server-性能及调优-调优-Java-虚拟机

Java 虚拟机(Java virtual machine,简称 JVM)是一种虚拟“执行引擎”实例,可在微处理器上执行 Java 类文件中的字节码。调整 JVM 的方式会影响 Weblogic Server 和应用程序的性能。

Velocity用户教程

Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。

Velocity用户手册

Velocity 用户手册是帮助页面设计者和内容提供者认识 Velocity 和其简单而功能强大的脚本语言――Velocity 模板语言(VTL)。在手册上的许多例子,都是用 Velocity 插入动态的内容到网页上,但是所有的 VLT 例子都能应用到其他的页面和模板中。


文章热度: 166291
文章数量: 333
推荐阅读

FlashFXP绿色版网盘下载,附激活教程 1782

FlashFxp百度网盘下载链接:https://pan.baidu.com/s/1MBQ5gkZY1TCFY8A7fnZCfQ。FlashFxp是功能强大的FTP工具

Adobe Fireworks CS6 Ansifa绿色精简版网盘下载 1565

firework可以制作精美或是可以闪瞎眼的gif,这在广告领域是需要常用的,还有firework制作下logo,一些原创的图片还是很便捷的,而且fireworks用法简单,配合dw在做网站这一块往往会发挥出很强大的效果。百度网盘下载链接:https://pan.baidu.com/s/1fzIZszfy8VX6VzQBM_bdZQ

navicat for mysql中文绿色版网盘下载 1623

Navicat for Mysql是用于Mysql数据库管理的一款图形化管理软件,非常的便捷和好用,可以方便的增删改查数据库、数据表、字段、支持mysql命令,视图等等。百度网盘下载链接:https://pan.baidu.com/s/1T_tlgxzdQLtDr9TzptoWQw 提取码:y2yq

火车头采集器(旗舰版)绿色版网盘下载 1707

火车头采集器是站长常用的工具,相比于八爪鱼,简洁好用,易于配置。火车头能够轻松的抓取网页内容,并通过自带的工具对内容进行处理。站长圈想要做网站,火车头采集器是必不可少的。百度网盘链接:https://pan.baidu.com/s/1u8wUqS901HgOmucMBBOvEA

Photoshop(CS-2015-2023)绿色中文版软件下载 1823

安装文件清单(共46G)包含Window和Mac OS各个版本的安装包,从cs到cc,从绿色版到破解版,从安装文件激活工具,应有尽有,一次性打包。 Photoshop CC绿色精简版 Photoshop CS6 Mac版 Photoshop CC 2015 32位 Photoshop CC 2015 64位 Photoshop CC 2015 MAC版 Photoshop CC 2017 64位 Adobe Photoshop CC 2018 Adobe_Photoshop_CC_2018 Photoshop CC 2018 Win32 Photoshop CC 2018 Win64

知之

知之平台是全球领先的知识付费平台。提供各个领域的项目实战经验分享,提供优质的行业解决方案信息,来帮助您的工作和学习

使用指南 建议意见 用户协议 友情链接 隐私政策 Powered by NOOU ©2020 知之