admin 管理员组

文章数量: 887021


2023年12月19日发(作者:soap是什么意思其中s表示)

第一章 Hibernate 入门

1.2.2 映射文件

映射文件告诉Hibernate,应该访问数据库(database)里面的哪个表(table)及应该使用表里面的哪些字段(column)

在hibernate-mapping标签之间,含有一个class元素。所有的持久化实体类都需要一个这样的映射,来把类对象映射到SQL数据库里的表。

1.2.3 Hibernate配置

使用一个XML配置文件来保存Hibernate的配置信息(比如连接池,数据源,用户名,密码)。

在这里,我们配置了Hibernate的SessionFactory-----一个关联于特定数据库全局的工厂。如果使用多个数据库,就要用多个,通常把它们放在多个配置文件中。并将相应的映射文件放在Hibernate配置中

1.3 第二部分 ----关联映射

13.2 单向Set-based的关联

我们将向Person类添加一连串的events。那样,通过调用nts(),就可以轻松地导航到特定person所参加的events,而不用去执行一个显示的查询。我们使用java的集合类(collection):set,因为set不包含重复的元素及我们无关的排序。

Public class Person{

Private Set events = new HashSet();

Public Set getEvents(){

Return events;

}

Public void setEvents(Set events){

= evnets;

}

}

对于多对多关联,需要一个关联表-PERSON_EVENT。表里面保存person到event的一个关联。

1.3.3 使关联工作

使一个类与另一个类相关联。

Sesson session = sionFactory().getCurrentSession();

ransaction();

Persion aPerson = (Person)(,personId);

Event anEvent = (Event)(,eventId);

nt().add(anEvent);

nsaction().commit();

1.3.4 值类型的集合

我们把一个值类型对象的结婚加入Person实体中。我们希望保存email地址,所以使用String类型。而且这次的集合类型又是Set。

PERSON_EMAIL_ADDR表里面有两个字段 ,PERSON_ID 和EMAL_ADDR。其中PERSON_ID为PERSON的主键,EMAIL_ADDR为一个String类型,用于保存地址。

把这个元素加入到集合中。

private void addEailToPerson(Long personId,String emailAddress){

Session session = sionFactory().getCurrentSession();

ransaction();

Person aPerson = (Person)(,personId);

lAddress().add(emailAddress);

nsaction().commit();

}

1.3.5 双向关联

双向关联(bi-directional association)----在Java里让person和event可以从关联的任何一端访问另一端。

首先,把一个参与者(person)的集合加入Event类中:

private Set participants = new HashSet();

public Set getParticipants(){

return participants;

}

public void setParticipants(Set participants){

ipants = participants;

}

在里面也映射这个关联

1.3.6使双向连起来

在person和event两边。相互加入引用集合。

1.4 第三部分 –EventManage web应用程序

第二章 体系结构

SessionFactory(nFactory):针对单个数据库映射关系经过编译后的内存镜像,是线程安全的(不可变)。它是生成Session的工厂,本身要用到ConnectioinProvider。该对象可以在进程或集群的级别上,为那些事务之间可以重用的数据提供可选的二级缓存。

Session:表示应该程序与持久储存层之间交互操作的一个单线程对象,此对象生存期很短。其隐藏了JDBC连接,也是Transaction的工厂。其会持有一个针对持久化对象的必选(第一级)缓存,在遍历对象图或者根据持久化标识查找对象时会用到。

持久的对象与集合:带有持久化状态的、具有业务功能的单线程对象,此对象生存期很短。这些对象可能是普通JavaBeans/POJO,唯一特殊的是他们正与(仅仅一个)session相关联。一旦这个Session被关闭,这些对象就会脱离持久化状态,这样就可被应用程序的任何层自由使用。(用作跟表示层打交道的数据传输对象)

瞬态(transient)和脱管(detached)的对象及其集合

那些目前没有与session关联的持久化实例。他们可能是在被应用程序实例化后,尚未进行持久化的对象。也可能是因为实例化他们的session已经被关闭而脱离持久化的对象。

事务Transaction:应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很短。它通过抽象将应用从底层具体的JDBC、JTA以及CORBA事务隔离开。某些情况下,一个Session之内可能包含多个Transaction对象。事务边界的开启与关闭时必不可少的。

ConnectionProvider:生成JDBC连接的工厂(同时也起到连接池的作用)。它通过抽象将应用从底层的Datasource或DriverManager隔离开。

TransactionFactory:生成transactioin对象实例的工厂。

2.2 实例状态

瞬态:该实例从未与任何持久化上下文关联过。它没有持久化标识(相当于主键值)

持久化:实例目前与某个持久化上下文有关联。它拥有持久化标识(相当于主键值),并且可能在数据库中有一个对应的行。对于某一个特定的持久化上下文,Hibernate保证持久化标识与Java标识等价。

脱管:实例曾经与某个持久化上下文发生过关联,不过那个上下文被关闭了。或者这个实例是被序列化到另外的进程。它拥有持久化标识,并且在数据库中可能存在一个对应的行。对于脱管状态的实例,Hibernate不保证任何持久化标识与Java标识的关系。

2.3 JMX整合

JMX是管理Java组件的J2EE标准。

2.4 对JCA的支持

2.5 上下文相关的Session

第三章 配置

3.1 可编程的配置方式

一个uration实例代表了一个应用程序中Java类型到SQL数据库映射的完整集合。Configuration被用来构建一个(不可变)SessionFactory。映射定义则由不同的XML映射定义文件编译而来。

(1) 直接实例化Configuration来获取一个实例,并为它指定XML映射定义文件。

(2) 指定映射的类,让Hibernate帮你寻找映射定义文件

(3) Hibernate在类路径(classpath)中寻找名字为…的映射文件

(4) ties是最简单的方式。

3.2 获得SessionFactory

SessionFactory sessions = essionFactory();

Hibernate允许你的应用程序创建多个SessionFactory实例。这对使用多个数据库的应用很有用

3.3 JDBC连接

打开一个Session:Session session = ssion();//open a new Session

3.4 可选的配置属性

3.4.1 SQL方言

如果指定一种方言,Hiberante将为上面列出的一些属性使用合适的默认值,为你省去了手工指定它们的功夫。

3.4.2 外连接抓取(Outer Join Fecching)

3.7 XML配置文件

XML配置文件被默认是放在CLASSPATH的根目录下

3.8 J2EE应用程序服务器的集成

针对J2EE体系,Hibernate有如下几个集成的方面:

.容器管理的数据源(Container-managed datasources):Hiberante能使用通过容器管理,并由JNDI提供的JDBC连接。

.自动JNDI绑定:Hibernate可以在启动后将SessionFactory绑定到JNDI。

.JTA Session绑定:Hibernate Session可以自动绑定到JTA事务作用的范围。

.JMX部署:如果你使用支持JMX用用程序服务器(如Jboss As),那么你可以选择Hibernate

部署成托管Mbean。

3.8.1 事务策略配置

三种标准(内建)的选择:

.ansactionFactory 委托给数据库(JDBC)事务

.nsactioniFactory:如果在上下文环境中存在运行着的事务(如EJB会话Bean的方法),则委托给容器管理的事务,否则,将启动一个新的事务,并使用Bean管理的事务。

.ctionFactory:委托给容器管理的JTA事务

事务:在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。

3.8.2 JNDI绑定的SessionFactory

3.8.3 在JTA环境下使用Current Session content(当前session上下文)管理

3.8.4 JMX 部署

第四章 持久化类(Persistent Classes)

简单传递Java对象(POJO:Plan Old Java Object)

一个POJO遵循四条主要的规则

1. 实现一个默认的(即无参数的)构造方法

2. 提供一个标识属性(inentifier property)(可选)

3. 使用非final的类(可选)

4. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators)(可选)

实现继承

实现equals()和hashCode()

动态模型(Dynamic models)

元组片断映射(Tuplizers)

第五章 对象/关系数据库映射基础(Basic O/R Mapping)

5.1 映射定义(Mapping declaration)

5.1.1 Doctype

所有的XML映射都需要定义如上所示的doctype。

5.1.2 hibernate-mapping:这个元素包括一些可选的属性。Sechema和catalog属性,指明了这个映射所连接(refer)的表所在的schema和/或catalog名称。

5.1.3 class

使用class元素来定义一个持久化类

5.1.4 id

被映射的类必须定义对应数据库表主键字段。大多数类有一个JavaBeans风格的属性,为每一个实例包含唯一的标识。元素定义了该属性到数据库表主键字段的映射。

5.1.4.1 Generator

可选的子元素师一个Java类的名字,用来为该持久化类的实例生成唯一的标识。如果这个生成器实例需要某些配置值或者初始化参数,用元素来传递。

5.1.5 composite-id

如果表使用联合主键,你可以映射类的多个属性为标识符属性。元素接受属性映射和属性映射作为子元素。

第二种方法 我们称为mapped(映射式)组合标识符。

5.1.6 鉴别器(discriminator)

元素是必需的,它定义了表的鉴别器字段。鉴别器字段包含标志值,用于告知持久化层应该为某个特定的行创建哪一个子类的实例。

5.1.9 property

元素为类定义了一个持久化的JavaBean风格的属性。

5.1.10 多对一 (many-to-one)

通过many-to-one元素,可以定义一种常见的与另一个持久化类的关联。这种关联模型时多对一关联。

5.1.11 一对一

持久化对象之间一对一的关联关系是通过one-to-one元素定义的。

5.1.12 自然ID(natural-id)

自然键是单个或组合属性,他们必须唯一且非空。在元素中列出自然键的属性。

5.1.13 组件(component),动态组件(dynamic-component)

元素把子对象的一些元素与父类对应的表的一些字段映射起来。然后组件可以定义它们自己的属性、组件或者集合。

5.1.14 properties

元素运行定义一个命名的逻辑分组(grouping)包含一个类的多个属性。这个元素最重要的用处是允许多个属性的组合作为property-ref的目标(target)。

5.1.15 子类(subcalss)

多态持久化需要为父类的每个子类都进行定义。对于“每一棵类继承树对应一个表”的策略来说,就需要使用定义。

5.1.16连接的子类(joined-subclass)

此外,每个子类可能被映射到他自己的表中(每个子类一个表的策略)。被继承的状态通过和超类的表关联得到。我们使用元素。

5.1.17 联合子类(union-subclass)

第三种选择是仅仅映射类继承树中具体类部分表中(每个具体一章表的策略)。其中每张表定义了类的所有持久化状态,包括继承的状态。

5.1.18 连接(join)

使用元素,假若在表之间存在一对一关联,可以将一个类的属性映射到多张表中。

5.1.19 键(key)

这个元素在父映射元素定义了对新表的连接,并且在被连接表中定义了一个外键引用原表的主键的情况下经常使用。

5.1.20 字段和规则元素(colunm and formula elements)

任何接受column属性的映射元素都可以选择接受子元素。

5.1.21 引用(import)

假设你的应用程序有两个同样名字的持久化类,但是你不想再Hibernate查询中使用它们的全限定名。除了依赖auto-import=”true”以为,类也可以被显示地”import(引用)”

5.1.22 any

这是属性映射的又一种类型。映射元素定义了一种从多个表到类的多态关联。这种类型的映射常常需要多于一个字段。第一个字段持有被关联实体的类型,其他的字段持有标识符。

5.2 Hibernate的类型

5.2.1 实体(Entities)和值(values)

实体entity独立于任何持有实体引用的对象。与通常的 Java模型相比,不再被引用的对象会被当作垃圾收集掉。实体必须被显示的保存和删除。

5.2.2 基本值类型

Integer,long,short,float,double,character,byte,boolean,yes-no,true_false这些类型都对应Java的原始类型或者其封装类,来符合SQL字段类型。

5.2.3 自定义类型

开发者创建属于他们自己的值类型。

5.3 多次映射同一个类

5.5 其他元数据(Metadata)

XML并不适用于所有人,因此有其他定义Hiberante O/R映射元数据(datadata)的方法

5.5.1 使用Xdoclet标识

5.5.2 使用JDK 5.0的注释(Annotation)

5.6 数据库生成属性

5.7 辅助数据库对象

第六章 集合类(Collections)映射

6.1 持久化集合类(Persistent collections)

包括HashMap,HashSet,TreeMap,TreeSet ,ArrayList

6.2 集合映射

6.2.1 集合外键(Collection foreign keys)

集合实例在数据库中依靠持有集合的实体的外键加以辨别。此外键作为集合关键字段加以引用。

6.2.2 集合元素

集合元素通过映射,或在其是实体引用的时候,通过映射。前两种用于使用值语义映射元素,后两种用于映射实体关联。

6.2.3 索引集合类

6.2.4 值集合于多对多关联

集合

集合

6.2.5 一对多关联

集合

集合

6.3 高级集合映射

6.3.1 有序集合

Hibernate支持实现Map和Set的集合

6.3.2 双向关联

双向关联允许通过关联的任一端访问另外一端。

在Hibernate中,支持两种类型的双向关联:

一对多(one – to - many):set或者bag值在一端,单独值(非集合)在另外一端。

多对多(many-to-many):两端都是set或bag值

要建立一个双向多对多关联,只需要映射两个many-to-many关联到同一个数据库表中,并再定义其中的一端为inverse。

第七章 关联关系映射

7.2 单项关联

7.2.1 多对一(many to one)

7.2.2 一对一(one to one)

基于外键关联的单向一对一关联和单向多对一关联几乎是一样的。唯一的不同就是单向一对一关联中的外键字段具有唯一性约束。

7.2.3 一对多(one to many)

7.3 使用连接表的单向关联

7.3.1一对多(one to many)

7.3.2 多对一(many to one)

7.3.3 一对一(one to one)

7.3.4多对多(many to many)

7.4 双向关联

第八章 组件(component)映射

8.1 依赖对象

在持久化的过程中,姓名(Name)可以作为人(Person)的一个组件。需要注意的是:你应该为姓名的持久化属性定义getter和setter方法。

元素。该元素还允许有子元素,用来表明component类中的一个属性是指向它的实体的引用。

8.2 在集合中出现的依赖对象

第九章 继承映射

9.1 三种策略

9.1.1 每个类分层结构一张表

9.1.2 每个子类一张表

9.1.3 每个子类一张表,使用辨别标志

9.1.4 混合使用“每个类分层结构一张表”和“每个子类一张表”

9.1.5 每个具体类一张表

第一种方法是使用

9.1.6 Table per concrete class ,using implicit polymorphism

另一种可供选择的方法时采用隐式多态:

第十章 与对象共事

10.1 Hibernate对象状态

.瞬时:由new 操作符创建,尚未被与Hibernate Session关联的对象被认定为瞬时的。瞬时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识。

.持久:持久的实例在数据库中有对应的记录,并拥有一个持久化标识。

.脱管:与持久对象关联的session被关闭后,对象就变为脱管的。对脱管对象的引用依然有效,对象可继续被修改。脱管对象如果重新关联到某个新的Session上,会再次转变为持久的。

10.2 使对象持久化

Hibernate认为持久化类新实例化的对象是瞬时的。我们可通过将瞬时对象与session关联而把它变为持久的。

DomesticCat fritz = new DomesticCat();

or();

(„M‟);

Long generatedId = (Long)(fritz);

如果Cat的持久化标识是 generated类型的。那么标识会自动在save()被调用。

10.3装载对象

10.4 查询

10.4.1 执行查询

一个查询通常在调用list()时被执行,执行结果会完全装载进内存中的一个集合。查询返回的对象处于持久状态。如果你知道的查询只会返回一个对象,可使用list()的快捷方式uniqueResult()。注意,使用集合预先抓取的查询往往会返回多次根对象(他们的集合类被初始化了)。你可以通过一个集合来过滤这些重复对象。

10.4.1.1 迭代式获取结果 (Iterator)

10.4.1.2 返回元组的查询

元组指一条结果行包含多个对象。Hibernate查询有时返回元组,每个元组以数组的形式返回。

10.4.1.3标量结果

10.4.1.4 绑定 参数

接口Query提供了对命名参数、JDBC风格的问号(?)参数进行绑定的方法。不同于JDBC,Hibernate对参数从0开始计数。命名参数在查询字符串中式形如:name的标识符。命名参数的优点是:

.命名参数与其在查询串中的出现的顺序无关。

.它们可在同一个查询串中多次出现

.它们本身是自我说明的

10.4.1.5 分页

如果你需要指定结果集的范围,应该使用Query接口提供的方法:

Query q = Query(“from DomesticCat cat”);

stResult(20);

Results(10);

List cats = ();

10.4.1.6 可滚动遍历

如果你的JDBC驱动支持可滚动的ResultSet,Query接口可以使用ScrollableResults,允许你在查询结果中灵活游走。

10.4.1.7 外置命名查询

你可以在映射文件中定义命名查询

如:

….

参数绑定及执行以编程方式完成

Query q = eQuery(“ByNameAndMaxmunWeight”);

ing(0,name);

(1,minWeight);

List cats = ();

10.4.2 过滤集合

集合过滤器(filter)是一种用于一个持久化集合或者数组的特殊的查询。查询字符串中可以使用“this”来引用集合中的当前元素。

Collection blackKittens = Filter(tens(),””);

10.4.3 条件查询

第十一章


本文标签: 对象 映射 关联 使用 元素