Hibernate教程.ppt

上传人:小飞机 文档编号:5433138 上传时间:2023-07-06 格式:PPT 页数:203 大小:760KB
返回 下载 相关 举报
Hibernate教程.ppt_第1页
第1页 / 共203页
Hibernate教程.ppt_第2页
第2页 / 共203页
Hibernate教程.ppt_第3页
第3页 / 共203页
Hibernate教程.ppt_第4页
第4页 / 共203页
Hibernate教程.ppt_第5页
第5页 / 共203页
点击查看更多>>
资源描述

《Hibernate教程.ppt》由会员分享,可在线阅读,更多相关《Hibernate教程.ppt(203页珍藏版)》请在三一办公上搜索。

1、Hibernate java对象持久化技术,Hibernate入门OR映射技术通过Hibernate API操纵数据库检索策略和方式数据库事务、并发、缓存与性能优化高级配置,Hibernate入门,案例,Hibernate,关系数据库,Customer类,BusinessService类,对象关系型映射,Hibernate API,Hibernate配置文件,Customers表,Hibernate入门,创建配置文件,hibernate.dialect=jdbc:oracle:thin:peopres/peopres127.0.0.1:1521:oracle9=peopres=peopresh

2、ibernate.show_sql=true,Hibernate配置文件,Hibernate入门,创建持久化类,public class Customer implements Serializable private static final long serialVersionUIDprivate Long id;private String name;private String email;public Customer()public Long getId()return id;public void setId(Long id)this.id=id;public String ge

3、tName()return name;,Hibernate入门,创建表,create table CUSTOMER(ID Integer primary key,NAME varchar2(15)not null,EMAIL varchar2(128)not null,PASSWORD varchar2(8)not null,PHONE varchar2(20),ADDRESS varchar2(255),SEX char(2),IS_MARRIED char(1),DESCRIPTION clob,IMAGE blob,BIRTHDAY date,REGISTERED_TIME timest

4、amp);,Hibernate入门,创建对象-关系映射文件,Hibernate入门,把customer持久化类映射到customers表,:类和表的映射:持久化类的OID和表主键映射,Hibernate入门,java、hibernate、sql类型对应关系,Hibernate入门,通过API操作数据库,Hibernate入门,通过API操作数据库,Hibernate入门,Hibernate初始化,1、创建configuration对象,把hibernate.properties文件读入内存。2、add()把映射文件读入内存3、buildSessionFactory()数据源。重量级对象。,Hi

5、bernate入门,Hibernate初始化访问Session接口,save()update()delete()load()find(),Hibernate入门,第一章 Java对象持久化概述,应用程序的分层体系结构,数据库,应用程序层,数据库,表述层,业务逻辑层,双层体系结构,三层体系结构,表述层:提供与用户交互的GUI(图形用户界面)。业务逻辑层:实现各种业务逻辑。数据库层:负责存放和管理应用的持久性数据。应用程序层:负责生成用户界面的代码和负责业务逻辑的代码 混合在一起。,第一章 Java对象持久化概述,应用程序的分层体系结构区分物理层和逻辑层 物理分层:每一层运行在单独的机器上,意味

6、着创建分布式软件系统。逻辑分层:在单个的软件模块中完成特定的功 能。不作特别说明,软件分层指的是逻辑分层。,第一章 Java对象持久化概述,应用程序的分层体系结构软件层的特征 1.每个层由一组相关的类或组件构成,共同完 成特定功能。2.层与层之间存在自上而下的依赖关系。不存在 跨层访问。3.每个层对上层公开API,但具体的实现细节 不对外透明。,第一章 Java对象持久化概述,应用程序的分层体系结构 软件分层的优点 1.伸缩性:能否支持更多用户。2.可维护性:需求变化时,影响一部分,不影 响其它部分的代码。3.可扩展性:增加薪功能的难以程度。4.可重用性:代码没冗余,满足多种需求。5.可管理性

7、:管理系统的难易程度。,第一章 Java对象持久化概述,应用程序的分层体系结构软件分层缺点 1.设计人员要求高 2.体细结构合理划分,耗时大 3.调试困难 4.对于规模较小的应用,软件分层会降低开发 效率。,第一章 Java对象持久化概述,应用程序的分层体系结构 Java应用的持久化层,表述层,业务逻辑层,数据库层,表述层,业务逻辑层,持久化层,数据库层,第一章 Java对象持久化概述,Hibernate中间件特性,应用1,业务逻辑层,应用2,业务逻辑层,应用3,业务逻辑层,持久化层(hibernate),数据库1,数据库2,数据库3,持久化层封装了数据访问的细节,为业务逻辑层提供了面向对象的

8、API。完善的持久化层应该达到的目标:1.代码重用性高,可完成所有的数据访问操作。2.如果需要的话,能够支持多种数据库平台。3.具有相对独立性,当持久化层变化时,不会影响上层实现。,第一章 Java对象持久化概述,软件模型 概念模型:模拟问题域中的真实实体。描述每个实体的概念和属性及实体间关系。不描述实体行为。实体间的关系有一对一、一对多和多对多。,客户Nameage,订单orderNumberprice,1,*,第一章 Java对象持久化概述,软件模型 关系数据模型:在概念模型的基础上建立起来的,用于描述这些关系数据的静态结构。有以下内容组成:1.若干表 2.表的所有索引 3.视图 4.触发

9、器 5.表与表之间的参照完整性,Customers表IDNAMEAGE,ORDERS表IDCustomerIDOrder_numberprice,第一章 Java对象持久化概述,软件模型域模型:在软件的分析阶段创建概念模型,在软件设计阶段创建域模型。组成部分:1.具有状态和行为的域对象。2.域对象之间的关联。,第一章 Java对象持久化概述,软件模型 域对象(domain object):构成域模型的基本元素就是域对象。对真实世界的实体的软件抽象,也叫做业务对象(Business Object(BO).域对象可代表业务领域中的人、地点、事物或概念。域对象分为以下几种:实体域对象:通常是指业务领

10、域中的名词。(plain old java object)。过程域对象:应用中的业务逻辑或流程。依赖 于实体域对象,业务领域中的动词。如 发出订单、登陆等。事件域对象:应用中的一些事件(警告、异常)。,第一章 Java对象持久化概述,软件模型域对象间的关系 1.关联:类间的引用关系。以属性定义的方式表现。,关联可分为一对一、一对多和多对多。还可分为单项关联和双向关联。,Order,Customer,单项关联:仅仅建立从Order到Customer的多对一关联,即仅仅在Order类中定义customer属性。或者仅仅建立从Customer到Order的一对多关联,即仅仅在Customer类中定义

11、orders集合。双项关联:既建立从Order到Customer的多对一关联,又建立从Customer到Order的一对多关联。,单项多对一,单项一对多,双项多对一,第一章 Java对象持久化概述,软件模型域对象间的关系 2.依赖:类之间访问关系。无需定义成属性。在A中访问B中的 方法或属性,或者A负责实例化B。,BusinessService,Customer,第一章 Java对象持久化概述,软件模型域对象间的关系 3.聚集(Aggregation):整体与部分的关系。例人与手的关系。部分类的对象不能单独存在,他的生命周期依赖于整体类的对象的生命周期,整体消失时,部分也随之消失。,Perso

12、nhand:set,Hand,第一章 Java对象持久化概述,软件模型域对象间的关系 4.一般化(Generalization):类之间继承关系。,Employeename,HourEmployeerate,SalaryEmployeesalary,第一章 Java对象持久化概述,内存,Customer对象,order对象,数据库,持久化,重新加载到内存,软件模型域对象的持久化概念 实体域对象在内存中创建后,不能永久存在。将实体域对象永久保存起来,就是持久化的过程。通常只有实体域对象需要持久化,过程域对象和事件域对象一般不需要持久化。广义持久化指增、删、改、查。,第一章 Java对象持久化概述

13、,直接通过JDBC API。,第一章 Java对象持久化概述,Hibernate是什么 面向java环境的对象/关系数据库映射工具。1.开源的持久层框架.2.ORM(Object/Relational Mapping)映射工具,建立面向对象的域模型和关系数据模型之间的映射.3.连接java应用和数据库的中间件.4.对JDBC进行封装,负责java对象的持久化.5.在分层结构中处于持久化层,封装对数据库的访问细节,使业务逻辑层更专注于实现业务逻辑,Hibernate历史,2001年末,Hibernate的第一个版本发布;2003年6月,Hibernate2发布,并于年末获得Jolt2004大奖,

14、后被JBOSS收纳为其子项目之一;2005年3月,Hibernate3正式发布。,第一章 Java对象持久化概述,Hibernate作用,Hibernate是Java应用和关系数据库之间的桥梁,它负责Java对象和关系数据之间的映射。Hibernate内部封装了通过JDBC访问数据库的操作,向上层应用提供了面向对象的数据访问API。,第一章 Java对象持久化概述,第一章 Java对象持久化概述,ORM简介对象-关系映射(ORM,即Object-Relation Mapping).指单个组件中负责所有实体域对象的持久化,封装数据访问细节。,域模型(对象、属性、关联、继承和多态),ORM API

15、ORM 实现,关系数据模型(表、字段、索引、主键和外键),业务逻辑层,对象-关系映射文件(xml),持久化层,数据库层,参照,ORM 充当业务逻辑层和数据库层之间的桥梁,第一章 Java对象持久化概述,ORM简介对象-关系映射的概念,域模型,Address类Provincecitystreetzipcode,Customer类idnamehomeAddresscomAddress,关系数据模型,Customer表IDHOME_PROVINCEHOME_CITYCOM_PROVINCECOM_CITY,注:域模型中类的数目要比关系数据模型中 表的数目多。,第一章 Java对象持久化概述,ORM简

16、介ORM中间件的使用方法 采用元数据来描述对象-关系映射细节,元数据通常采用xml格式,并存放在专门的对象-关系映射文件中。只要配置了持久化类与表的映射关系,orm中间件在运行时就能够参照映射文件的信息,把域对象持久化到数据库中。,public void deleteCustomer(Customer c)Session session=getSession();session.delete(c);执行步骤如下:1.运用反射机制,获得Customer对象的Customer.class类。2.参照映射文件得到Customer类对应的表的信息,以及和Customer类关联的类以及 相应的表信息。3

17、.根据以上信息生成SQL语句。4.调用JDBC API,执行该语句。,Hibernate软件包,要使用Hibernate,需要得到Hibernate的jar包和相应的一些第三方包。在使用Hibernate时,需要用到的是 Hibernate.jar和lib目录下的一些第三方jar包。,第一章 Java对象持久化概述,Hibernate软件包,hibernate3.jar:包含Hibernate3的基础框架和核心API类库,是必须使用的jar包。cglib-2.1.2.jar:CGLIB库,Hibernate用它来实现PO字节码的动态生成,它是非常核心的库,是必须使用的jar包。dom4j-1.

18、6.1.jar:dom4j是一个Java的XML API,类似于jdom,用来读写XML文件。commons-collections.jar:Apache Commons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大。必须使用的jar包。commons-logging.jar:Apache Commons包中的一个,包含了日至功能,必须使用的jar包。,第一章 Java对象持久化概述,Hibernate可选包(1),ant-1.6.5.jar:Ant编译工具的jar包,用来编译Hibernate源代码的。它是可选包。c3po-0.9.0.jar:C3PO是一个

19、数据库连接池,Hibernate可以配置为使用C3PO的连接池,如果准备用这个连接池,就需要这个jar包。connector.jar:JCA(JavaCryptographyArchitecture,Java加密架构,java平台中用于访问和开发加密功能的框架)规范,如果在App Server上把Hibernate配置为Connector,就需要这个jar。一般App Server都会带上这个包。jaas.jar:JAAS是用来进行权限验证的,已经包含在JDK1.4里面了。所以它的实际上是多余的包。,第一章 Java对象持久化概述,Hibernate可选包(2),jdbc2_0-stdext.

20、jar:JDBC2.0的扩展包,一般来说数据库连接池会用上它,不过App Server都会带上它,所以也是多余的。jta.jar:JTA(java事务处理的机制)规范,当Hibernate使用JTA的时候需要,不过App Server都会带上它,所以也是多余的。junit-3.8.1.jar:Junit包,当运行Hibernate自带的测试代码的时候需要,否则就不用。和xml-apis.jar:Xerces是XML解析器,xml-apis实际上是JAXP。也是多余的包。,第一章 Java对象持久化概述,第一章 Java对象持久化概述,Hibernate API简介 1.提供访问数据库操作(se

21、ssion,transaction,query)2.配置hibernate接口(configuratioin)3.回调接口(Interceptor,Lifecycle,Validatable)4.用于扩展的功能接口(UserType,CompositeUserType,IdentifierGenerator),Hibernate对JDBC做了轻量级的封装。所谓轻量级是指Hibernate并没有完全封装JDBC,java应用既可以通过HibernateAPI来访问数据库,还可直接通过JDBC API访问数据库。,第一章 Java对象持久化概述,Hibernate API简介 Hibernate核

22、心接口 1.Configuration 配置hibernate,根启动hibernate,创建sessionFactory对象。2.sessionFactory 负责创建Session对象,可以通过Configuration对象创建SessionFactory对象。SessionFactory 对象中保存了当前的数据库配置信息和所有映射关 系以及 预定义的SQL语句。同时,SessionFactory还负责维护Hibernate的二级缓存。SessionFactory对象的创建会有较大的开销,而且SessionFactory对象采取了线程安全的设计方式,因此在实际中SessionFactory

23、对象可以尽量的共享,在大多数情况下,一个应用中针对一个数据库可以共享一个SessionFactory实例,Configuration config=new Configuration().configure();SessionFactory factory=config.buildSessionFactory();,3.Session 使用最广泛,也被称为持久化管理器,它提供和持久 化相关的操作。增、删、改、查等。不是线程安全的,因此,一个Session对象只可以由一个线程使用。避免多 个线程共享。轻量级的,创建和销毁不需要消耗太多资源。Session中有一个缓存,称为一级缓存。存放当前工作单

24、元加 载的对象。,Configuration config=new Configuration().configure();SessionFactory factory=config.buildSessionFactory();Session session=factory.openSession();,第一章 Java对象持久化概述,4.Transaction hibernate数据库事务接口,将应用代码从底层的事务实现中抽象出来这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)允许应用通过一组一致的API控制事务边界。使用Hibernate进行操作

25、时(增、删、改)必须显示的调用Transaction(默认:autoCommit=false)Transaction tx=session.beginTransaction();,第一章 Java对象持久化概述,5.Query和Criteria接口:都是查询接口,query实例 包装了HQL查询语句,hql是面向对象的,他引用类 名及类的属性名,而不是表名和字段名。Criteria接 口完全封装了基于字符串形式的查询语句,比 query接口更面向对象,他擅长执行动态查询。sessoin接口的find方法也具有数据查询功能,但他 只是执行一些简单的hql查询语句的快捷方式,远没 有query接口

26、功能强大。,第一章 Java对象持久化概述,回调接口 1.Lifecycle和Validatable接口:lifecycle接口能使 持久化类响应被加载、保存和删除事件。Validatable接口使持久化类的接口被保存之前进行 数据验证。这种方式强迫持久化类实现特定接口,使hibernate API渗透到持久化类中,会影响可移 植性,不值得推荐。2.Interceptor:不必由持久化类来实现。可定义专门实现该接口的类,负责响应持久化类的实例被加载、保存、更新或删除的事件。,第一章 Java对象持久化概述,Hibernate映射类型接口 1.PrivateType类:映射java基本数据类型,

27、包括 ByteType、ShortType、IntegerType、LongType、FloatType、DoubleType、CharactorType、BooleanType。2.DateType:映射java日期类型。3.BinaryType:映射Byte类型。,Query.setParameter(“name”,”name”,Hibernate.STRING),第一章 Java对象持久化概述,可供扩展的接口 hibernate提供的多数功能是可配置的,允许用户选择适当的内置策略。如可配置如下数据库方言:hibernate.dialect=hibernate.dialect=hibern

28、ate.dialect=,Java对象持久化概述,可供扩展的接口 如果hibernate内置的策略不能满足需求时,允许用户自定义实现接口或扩展特定的类。Hibernate的扩展点包括:主键生成策略:IdentifierGenerator sql方言:Dialect抽象类 缓存机制:cache和cacheprovider接口 jdbc连接管理器:connectionprovider等,Hibernate运行过程,Hibernate的运行过程如下:1、应用程序先调用Configuration类,该类读取Hibernate配置文件及映射文件中的信息,2、并用这些信息生成一个SessionFactor

29、y对象,3、然后从SessionFactory对象生成一个Session对象,4、并用Session对象生成Transaction对象;A、可通过Session对象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法对PO进行加载、保存、更新、删除、等操作;B、在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将提交这些操作到数据库中。,应用程序,Configuration,SessionFactory,Session,Query,映射文件.hb

30、m.xml,Transaction,配置文件,回滚,提交,数据库,查询,异常,正常,Java对象持久化概述,小结,表现层,业务逻辑层,持久化层(orm中间件、负责封装数据访问细节),数据库层,实体域对象(业务数据),过程域对象(业务逻辑),第二章 对象-关系映射基础,本章解决的问题 1.持久化类没有getXXX和setXXX方法。2.持久化类的属性在库中没有对应的字段,或 字段没有对应的属性 3.控制hibernate的insert、update语句。4.设置从持久化类映射到数据库表,以及持久 化类的属性映射到数据库表的字段的命名策 略。,数据类型对比,数据类型对比,第二章 对象-关系映射基础

31、,持久化类的属性及访问方法Hibernate中持久化类的访问者有两个:1.Java应用程序2.hibernate(何时调用get、set方法?),Customer对象,getXXX()方法,setXXX()方法,hibernate,Java应用程序,用户界面,数据库,Java应用程序不能访问持久化类的private方法,而hibernate没有这个限制,它可以访问各种级别的方法。,第二章 对象-关系映射基础,持久化类的属性及访问方法 基本数据类型和包装类型 基本数据类型和包装类型对应的hibernate映射类型相同.,基本类型可直接运算、无法表达null、数字类型的默认值为0。包装类默认值是n

32、ull。当对于默认值有业务意义的时候需要使用包装类。,第二章 对象-关系映射基础,持久化类的属性及访问方法Hibernate访问持久化类属性的策略 1.property默认值:表明hibernate通过getXXX和 setXXX来访问类属性。推荐使用。提高域模型透明性。2.field:hibernate通过java反射机制直接访问类属性。对于没有 javabean方法的属性可设置该访问策略。,除了设置property属性的access为field和property之外还可以自定义访问策略,需要创建实现.property.PropertyAccessor接口的类.然后把类的完整名字赋值给元素的

33、access属性,第二章 对象-关系映射基础,持久化类的属性及访问方法在持久化类的方法中加入程序逻辑,class Customer.private String firstname;private String lastname;public String getName()return firstname+“”+lastname;public void setName(String name)StringTokenizer t=new StringTokenizer(name);firstname=t.nextToken();lastname=t.nextToken();,第二章 对象-关系

34、映射基础,持久化类的属性及访问方法在持久化类的方法中加入程序逻辑 在文件中无需映射firstname和lastname属性,而是映射name属性。,尽管类中并没有name属性,由于hibernate不是直接访问Name属性,而是调用get、set方法,因此建立了Firstname、Lastname和表之间的联系。,HibernategetName()setName(),CUSTOMERS表,Name字段,Customer类,firstnamelastname,第二章 对象-关系映射基础,持久化类的属性及访问方法在持久化类的方法中加入程序逻辑 不管在类中是否存在name属性,只要在文件中映射了n

35、ame属性,在hql语句中就能访问他。,Session.find(“from customer as c where c.name=tom”),如果改成:后过如何?,第二章 对象-关系映射基础,持久化类的属性及访问方法在持久化类的方法中加入程序逻辑 在customer类的setOrders()方法中加入程序逻辑。,Public void setOrders(Set orders)this.orders=orders;calprice();Public calprice()setAvgPrice(avgprice);,第二章 对象-关系映射基础,持久化类的属性及访问方法在持久化类的方法中加入程序

36、逻辑 在setSex()方法中加入数据验证逻辑,Public void setSex(char sex)if(sex!=M,第二章 对象-关系映射基础,持久化类的属性及访问方法设置派生属性 利用元素的formula属性,用来设置一个sql表达式,hibernate将根据它来计算出派生属性的值。,另一种方案:在映射文件中不映射属性,在set方法中加入程序逻辑。,第二章 对象-关系映射基础,持久化类的属性及访问方法控制insert、update语句,第二章 对象-关系映射基础,处理sql引用标识符 在SQL语法中,标识符是指用于为数据库表、视图、字段或索引等命名的字符串,常规标识符不包括空格,也不

37、包含特殊字符,因此无需使用引用符号。如果数据库表名或列名包含特殊字符,可以使用引用标识符。,第二章 对象-关系映射基础,设置类的包名 如果在一个映射文件中包含多个类,并且这些类位于同一个包中,可以设置元素的package属性,避免为每个类提供完整的类名。,第三章 映射对象标识符,Java按内存地址区分同一个类的不同对象,关系数据库用主键区分同一个表的不同记录,Hibernate使用OID(对象标识符)来建立内存中的对象和数据库中记录的对应关系。对象的OID和数据库表的主键对应。为保证OID的唯一性和不可变性,应该让Hibernate而不是应用程序来为OID赋值。,第三章 映射对象表示符,关系数

38、据库按主键区分不同记录 主键必备条件:1.不允许null 2.唯一,不重复 3.值永远不会改变 自然主键:把具有业务含义的字段作为主键叫做自然主键。,第三章 映射对象表示符,关系数据库按主键区分不同记录把主键定义为自动增长类型 在my SQL中,把字段设为auto_increment类型,数据库会自 动为主键付值。在ms SQL server中,把字段设为identity类型,数据库会自 动为主键付值。从序列(sequence)中获取自动增长的描述符 create sequence seq_customer increment by 2 start with 1 insert into cus

39、tomers values(seq_customer.curval,.),第三章 映射对象表示符,Java语言按内存地址区分不同的对象-equals()和=方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。Java.lang 包中的Object 类有public boolean equals(Object obj)方法。它比较两个对象是否相等。仅当被比较的两个引用指向同一对象时,对象的equals()方法返回true。=运算符也进行等值比较。也就是说,对于任何引用值X 和Y,当且仅当X 和Y 指向同一对象时,X=Y返回真。当两个分

40、离的对象的内容和类型相配的话,String,Date,File 类和所有其它override equals()的包装类(Integer,Double,等等)将返回真。,第三章 映射对象标识符,Hibernate中用对象标识符(OID)来区分对象 OID是关系数据库中的主键在java对象模型中的等价物。在运行时,hibernate根据OID来维持java对象和数据库记录的对应关系。,Customer c1=(Customer)session.load(Customer.class,new Long(1);Customer c2=(Customer)session.load(Customer.cl

41、ass,new Long(1);Customer c3=(Customer)session.load(Customer.class,new Long(3);c1=c2?c1=c3?子元素用来设定标识符生成器。Hibernate提供了标识符生成器接口:,并提供了多种内置的实现。,第三章 映射对象标识符,第三章 映射对象表示符,Hibernate内置标识符用法Increment:使用increment方式时,hibernate将按照递增的方式设定主键,具体的方式是,先获取当前记录主键的最大值,然后再将该值加1作为主键。,select max(id)from table;适用范围:1。由于不依赖与底

42、层数据库,适合所有的数据库系统。2。单个进程访问同一个数据库的场合,集群环境下不推荐适用。3。OID必须为long、int或short类型,如果把OID定义为byte类型,抛异常。,第三章 映射对象表示符,Hibernate内置标识符用法Identity:identity方式表示数据库的主键生成方式为采用数据库的主键生成机制,例如SQL Server或MySQL的自动主键生成机制。由底层数据库生成标识符.需要把字段定义成自增型。my sql 中为auto_increment ms sql server中为identity,第三章 映射对象表示符,Hibernate内置标识符用法Sequence

43、:这种方式针对由序列方式产生主键的数据库,例如Oracle。在的子元素指定用作产生 主键的序列名称。,tester_id_seq,适用范围:底层数据库要支持序列。Oracle DB2 SAP等。OID必须为long、int或shot类型,如果把OID定义为byte类型,运行时抛异常。,第三章 映射对象表示符,Hibernate内置标识符用法Hilo:Hilo标识符生成器由Hibernate按照一种hign/low算法来生成标识符,他从数据库的特定表的字段中获取high值。,hi_value next_value 100,使用范围:该机制不依赖于底层数据库,因此适用于所有的数据库系统。OID必须

44、为long、int、short类型,如果为byte类型的话,会抛出异常。Net.sf.hibernate.id.IdentifierGeneratorException:this id generator generatesLong、integer、short。,第三章 映射对象表示符,Hibernate内置标识符用法Native:native方式意味着将主键的生成机制交由Hibernate决定,Hibernate会根据配置文件中的方言(Dialect)定义,采用不同的数据库特定的主键生成方式。,适用范围:该类型能根据底层数据库系统的类型,自动选择合适的标识符生成器,因此很适合于跨数据库的平台

45、,即在同一个应用中需要连接多种数据库系统的场合。OID必须为long、int、short类型,如果为byte类型的话,会抛出异常。Net.sf.hibernate.id.IdentifierGeneratorException:this id generator generatesLong、integer、short。,第三章 映射对象表示符,映射自然主键映射单个自然主键:主键由应用逻辑产生,实体对象再保存之前,必须显式的设置OID,主键的产生无需Hibernate的干预。,第三章 映射对象表示符,映射自然主键映射复合主键,使用联合主键的持久化类需要实现serializable接口和覆盖equ

46、als()、hashCode()方法。,可以使用StudentsinfoId属性来设置连联合主键,第四章 映射一对多关联关系,Order到Customer的多对一单向关联,Customer 到Order的一对多单向关联,Customer 到Order的一对多双向关联,第四章 映射一对多关联关系,建立多对一的单向关联关系,?,第四章 映射一对多关联关系,many-to-one属性:name:设定待映射的持久化类的属性名。column:设定和持久化类的属性对应的表的外键。class:设定持久化类的属性的类型。not-null:属性是否允许为空。默认值是false表示可以为空。,建立多对一的单向关联

47、关系(续),第四章 映射一对多关联关系,tx=session.beginTransaction();Customer c=new Customer();c.setName(TOM);session.save(c);?会有什么后果Order o1=new Order();o1.setOrderNumber(1);o1.setCustomer(c);Order o2=new Order();o2.setOrderNumber(1);o2.setCustomer(c);session.save(o1);session.save(o2);mit();,第四章 映射一对多关联关系,建立多对一的单向关联关

48、系not-null属性,tx=session.beginTransaction();Customer c=new Customer();c.setName(TOM);/session.save(c);?会有什么后果Order o1=new Order();o1.setOrderNumber(1);o1.setCustomer(c);Order o2=new Order();o2.setOrderNumber(1);o2.setCustomer(c);session.save(o1);session.save(o2);mit();,第四章 映射一对多关联关系,建立多对一的单向关联关系级联保存和更

49、新 当hibernate持久化一个临时对象时,在默认情况下,他不会自动持久化所关联的其他临时对象,会抛出TransientObjectException.如果设定many-to-one元素的cascade属性为save-update的话,可实现自动持久化所关联的对象。,?,第四章 映射一对多关联关系,映射一对多双向关联关系,Class Customer public Set orders=new Set();public Set getOrders()return orders;public void setOrders(Set orders)this.orders=orders;,Custo

50、mer c=new Customer(“TOM”);Order o1=new Order(“11”);O1.setCustomer(c);c.getOrders().add(o1);session.save(c);mit();,第四章 映射一对多关联关系,映射一对多双向关联关系(续)Hibernate要求在持久化类中定义集合属性时,必须把属性声明为接口类型,如Set、Map、List.声明为接口类型可提高持久化类的透明性,当hibernate调用setOrders()方法时,传递的参数是Hibernate自定义的实现该接口类的实例。如果定义成类(如HashSet)型,强迫hibernate把该

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号