hibernate关系映射实验指导

合集下载

hibernate的基本用法

hibernate的基本用法

hibernate的基本用法Hibernate是一个开源的Java框架,用于简化数据库操作。

它为开发人员提供了一个更加简单、直观的方式来管理数据库,同时也提高了应用程序的性能和可维护性。

本文将逐步介绍Hibernate的基本用法,包括配置、实体映射、数据操作等。

一、配置Hibernate1. 下载和安装Hibernate:首先,我们需要下载Hibernate的压缩包并解压。

然后将解压后的文件夹添加到Java项目的构建路径中。

2. 创建Hibernate配置文件:在解压后的文件夹中,可以找到一个名为"hibernate.cfg.xml"的文件。

这是Hibernate的主要配置文件,我们需要在其中指定数据库连接信息和其他相关配置。

3. 配置数据库连接:在"hibernate.cfg.xml"文件中,我们可以添加一个名为"hibernate.connection.url"的属性,用于指定数据库的连接URL。

除此之外,还需要指定数据库的用户名和密码等信息。

4. 配置实体映射:Hibernate使用对象关系映射(ORM)来将Java类映射到数据库表。

我们需要在配置文件中使用"mapping"元素来指定实体类的映射文件。

这个映射文件描述了实体类与数据库表之间的对应关系。

二、实体映射1. 创建实体类:我们需要创建一个Java类,用于表示数据库中的一行数据。

这个类的字段通常与数据库表的列对应。

同时,我们可以使用Hibernate提供的注解或XML文件来配置实体的映射关系。

2. 创建映射文件:可以根据个人喜好选择使用注解还是XML文件来配置实体类的映射关系。

如果使用XML文件,需要创建一个与实体类同名的XML文件,并在其中定义实体类与数据库表之间的映射关系。

3. 配置实体映射:在配置文件中,我们需要使用"mapping"元素来指定实体类的映射文件。

Hibernate(6)—— 一对多和多对多关联关系映射(xml和注解)总结

Hibernate(6)—— 一对多和多对多关联关系映射(xml和注解)总结

Hibernate(6)——一对多和多对多关联关系映射(xml和注解)总结涉及的知识点总结如下:∙One to Many 映射关系o多对一单向外键关联(XML/Annotation)o一对多单向外键关联(XML/Annotation)o懒加载和积极加载o一对多双向外键关联(XML/Annotation)∙Many to Many 映射关系o多对多单向外键关联(XML/Annotation)o多对多双向外键关联(XML/Annotation)o set的inverse元素详解∙问题小结∙关联关系的优缺点多对一单向外键关联关系注意多对一关联是多方持有一方的引用。

看一个例子,去淘宝购物,那么一个淘宝用户可以对应多个购物订单,如图所示:多的一方是Orders,持有一方的引用,也就是Users,而在Users中无需作任何定义,从订单到用户的关系是单向多对一关联。

对应数据库就是:还有比如说学生和班级的关系,多个学生可以属于同一个班级,这就是从学生到班级也是典型的单向多对一关系,看代码实现:基于注解的多对一单向外键关联:单向多对一关联中,多方需要持有一方的引用,那么多方(学生类)需要额外配置,需要对持有的一方引用使用注解@ManyToOne (cascade={CascadeType.ALL}, fetch=FetchType.EAGER),设置为级联操作和饥渴的抓取策略,@JoinColumn(name="cid"),而一方(教室类)无需做任何多方的定义。

注意;多方必须保留一个不带参数的构造器!importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;//班级类,在多对一关系中属于一的方,不持有其他多余的配置,反而是被多方持有@Entitypublic class ClassRoom {private intcid;//班级编号private String cname;//班级名称// 自动增长的主键@Id@GeneratedValuepublicintgetCid() {returncid;}public void setCid(intcid) {this.cid = cid;}public String getCname() {returncname;}public void setCname(String cname) {ame = cname;}}View Code一方——班级类无需做多余的定义,下面是多方——学生实体和配置:importjavax.persistence.CascadeType;importjavax.persistence.Entity;importjavax.persistence.FetchType;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;importjavax.persistence.JoinColumn;importjavax.persistence.ManyToOne;//学生实体类,属于多对一的多方,持有班级(一方)的引用@Entitypublic class Students {private intsid; //编号private String sname; //姓名private ClassRoom classroom;//学生班级//注意:多方一定要显式的定义不带参数的构造方法public Students() {}public Students(String sname){this.sname = sname;}// 多方使用注解:@ManyToOne// fetch=FetchType.EAGER,急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。

对象/关系映射与Hibernate框架的应用研究

对象/关系映射与Hibernate框架的应用研究

以下将讨 论的是 : 对象 / 映射 中类 映射 到数 据表 的几 个 策 略 . 出了利 用 对象 / 系 映射框 架 HDr 关系 提 关 ieo
ht 来 实现对象 的持久 化 , 而节约开 发 时间和开 发成本 . a e 从
2 对象/ 关系映射 中类映射到数据表 的几个策略

般 来说 , 象/ 系映射 应遵循 下述原 则 :1 对 关 ()对象 有唯 一 的标 识 , 这个 标识必 须被 持久化并 作为 表 的
维普资讯
2 0 年 9月 07
韶 关学 院学报 ・自然科 学
J u l f h o u n Unv ri o ma a g a iest oS y・N trl ce c au a S in e
S p. 0 7 e 20 Vo . No. 128 9

张表存 储 , 只须将父 类 的属性 及子类 的扩展 属性 一一
图 3 类 及 其 继 承 关 系
Ta e bl na e a m ddr S s u i SS eS al aton N t ype
映射 为 表 中 的 列 , 在 数 据 库 表 中 增 加 一 个 识 别 列 并
图 1 一 个 类 映 射 到 一个 数 据 库 表
收 稿 日期 :07 7 o 20 —0 —3
作者简介 : 廖福保( 一 , , 1 9 ) 江西宁都人 , 男 广东农工商职业技术学院计算机科学系讲师, 硕士研究生 , 主要从事计算机应用与软件开发
维普资讯
t e 用 以标 志不 同的类 ( 图 4所示 ) 这种 方法 的优点 y , p 如 .
1 对 象/ 系映射 关
使 用面 向对象 的语 言访 问关 系数据 库 时 , 个 必须 处 理 的 问题 是 : 一 如何 将 应 用 系统 对 象模 型 映射 到关

映射:表之间的关联

映射:表之间的关联

映射:表之间的关联⽅法⼀:主要是set的设置Order.hbm.xml<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name=".hibernate.entities.Order" table="ORDERS"><id name="orderId" type="ng.Integer"><column name="ORDER_ID" /><generator class="native" /></id><property name="orderName" type="ng.String"><column name="ORDER_NAME"/></property><!-- 映射多对⼀的关联关系怎样设置关联关系,以及关联关系怎么设置--><set name="customer" cascade="save-update" inverse="true"><key column="CUSTOMER_ID"></key><one-to-many class=".hibernate.entities.Customer"/></set><!-- 映射多对⼀的关联关系<many-to-one name="customer" class="Customer" column="CUSTOMER_ID" />--></class></hibernate-mapping>Customer.hbm.xml<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name=".hibernate.entities.Customer" table="CUSTOMER"><id name="customerId" type="ng.Integer"><column name="CUSTOMER_ID" /><generator class="native" /></id><property name="customerName" type="ng.String"><column name="CUSTOMER_NAME"/></property></class></hibernate-mapping>实现的效果是可以同时对两张表进⾏操作是单向多对⼀。

hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了

hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了
• 增加山南区下属的三个街道:“和平路” 、“八一路”和“五四大道”
在many一方删除数据1
• 删除“五四大道”
inverse设为true,由many一方删除 从one一方去“删除”, Hibernate只是执行了 问题出在配置文件上 update语句。还是未删 没有配置set节点的inverse属性 除成功! 根本没有执行 Delete语句,数据 没有被删除!
– 配置Hibernate多对多关联,实现某OA系统项 目和人员对照关系的管理
本章目标
• 掌握单向many-to-one关联 • 掌握双向one-to-many关联 • 掌握many-to-many关联
实体间的关联
• 单向多对一
tblJd.getQx().getQxname();
• 单向一对多
TblJd jd = (TblJd)tblQx.getJds().get(0); jd.getJdname(); tblQx.getJds.add(jd);
小结
• 在租房系统中,房屋信息(Fwxx)与用户 (User)间也是多对一关系。如何配置映 射文件,使之可以通过下面的代码输出房 屋信息和发布该信息的用户名称? Fwxx fwxx = (Fwxx)super.get(Fwxx.class,1);
System.out.println( fwxx.getTitle() + "," + fwxx.getUser.getUname());
inverse是“反转”的意思,表示关联关系的控制权。 为true,表示由对方负责关联关系的添加和删除; 执行了delete语句, 为false,表示由自己负责维护关联关系。 删除成功
• 在many一方删除数据的正确做法:

Hibernate中关联关系映射策略研究与实现

Hibernate中关联关系映射策略研究与实现
表示 层 务逻辑层打交道
业务逻辑层
l 接收表示层提交的表单数据, 进行相应的业务逻辑处理 l I处理通过持久层取得的原始数据,结果再送入持久层处理 I l 将业务逻辑层处理的结果反馈给表示层
业务逻辑层 持久层打交道

进一步提高软件开发 的效率以及 降低软件开发的难 度, 基于 We b的应 用 通 常 采用 四层 式 的软件 开发 框 架, 分层降低了系统各部分之间的耦合程度 , 增加了 系统 的可 维护 性和可 扩展 性L 。 2 ]
l 概

随着计算机软件开发技术 的快速发展 , b应 We 用程 序 的体 系结 构也 由单层 向两层 、 三层甚 至更 多层 次 的方 向发展 , e 用 程 序 通 常 涉 及 到 对 大 型 数 W b应 据库 的访 问操作 。两 层 的开 发模 型实 现 了应 用层 与 数 据 层 的分 离 , 应用 层 包括 用 户 界 面 、 务逻 辑 和数 业 据持久 化等 功 能 , 据层用 于保存 需要 进行 持久 化 的 数 数 据 。两层 模 型 中, 业务 逻 辑 、 据 持 久化 以及 用 将 数 户界 面都集 中在 应用 层 , 得 应 用 层 过 于臃 肿 , 使 因此 提 出了三层 的软 件开 发架构 。三 层架 构 中 , 应用 层划 分为 表示层 和业 务 逻 辑层 , 就 是 通 常所 说 的 MVC 这 ( dl Mo e—Vi e w—C n rl模 型 一视 图 一 控 制 ) 式 o to, 模 的系统 开发 架构 , MVC 模 式 的 广 泛 应 用 , 生 了 催 MVC框架 _ 。三层 模 型 虽 然 实 现 了业 务 逻 辑 和 用 1 ]
Hient brae的配 置 文 件 可 以使 用 hb raecg ient. f.

备课笔记10

备课笔记10

课题10 Hibernate映射机制教学目的:掌握Hibernate映射机制教学内容:—基于Hibernate学生管理信息系统的实现教学重点:Hibernate配置文件Hibernamte组件映射配置Hibernamte持久类中集合类型数据映射配置Hibernamte关联关系配置HQL教学难点:Hibernamte关联关系配置HQL使用案例:学生管理信息系统教材对应章节:第10章, 第11章,授课内容:1.1Hibernate配置文件Default-access: property |field 默认按property访问—对象属性状态操作方式设置Package :指定本持久化配置文件中的class的包名Default-lazy:指定本持久化配置文件是否采用延迟加载Default-cascade:指定本持久化配置文件上中的class级联说明:如何为eclipse 的hibernate 配置文件(*.hbm.xml)加上自动提示功能:Step1:先查找到.dtd文件的位置Step2:如下图操作1.2Hibernamte组件映射配置1)普通组件映射Hibernate.cfg.xmlUsers.hbm.xmlHibernateTest.java2)动态组件的映射Users.javaUsers.hbm.xmlHibernateTest.java组合与关联的区别:是否有定义持久化配置文件1.3Hibernamte持久类中集合类型数据映射配置1)特征分析Array数组ListMapset2)代码Users.javaUsers.hbm.xmlHibernateTest.java1.4Hibernamte持久类中关联关系映射配置1)一对一关系映射HibernateOne2OneA.Address.java注意:提供Get/Set方法提供不带id,及关联对象的构造方法ers.javaers.hbm.xmlD.Address.hbm.xmlE.HibernateTest.java2)一对多关系映射-Seters.javaers.hbm.xmlC.Address.hbm.xmlD.HibernateTest.java3)一对多关系映射-Listers.javaers.hbm.xmlC.HibernateTest.javaers.javaB.Address.javaers.hbm.xmlD.Address.hbm.xmlE.HibernateTest.java1.5HQLHQL是一种以面向对象的方式来写查询语句结构HQL中只能有属性和类参照原有的sql,列名改成属性名,表名改成类名HibernateTest.java。

hibernate saveorupdate举例使用

hibernate saveorupdate举例使用

hibernate saveorupdate举例使用Hibernate是一个用于Java语言的对象关系映射框架,它提供了一种将对象模型与关系数据库进行映射的方式,使开发人员可以通过面向对象的方式进行数据库操作。

其中,saveOrUpdate()是Hibernate中一个常用的方法,用于保存或更新实体对象。

在本文中,我将详细介绍saveOrUpdate()方法的使用,并以示例代码来演示其具体的操作步骤。

首先,我们需要配置Hibernate的相关环境和依赖。

在项目的pom.xml 文件中,添加如下的Hibernate依赖:xml<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.4.0.Final</version></dependency>同时,我们需要在项目中配置Hibernate的相关配置文件,如hibernate.cfg.xml。

在该文件中,我们需要配置数据库的连接信息、实体类与数据库表的映射关系等。

接下来,我们创建一个实体类,假设为User,用于映射到数据库中的一张用户表。

javaEntityTable(name = "user")public class User {IdGeneratedValue(strategy = GenerationType.IDENTITY)private Long id;Columnprivate String username;Columnprivate String password;getters and setters}在上述代码中,我们使用Entity注解将User类与数据库表进行映射,并使用Table注解指定了数据库表的名称。

第8章 NHibernate高级数据映射和查询

第8章 NHibernate高级数据映射和查询

第8章 NHibernate高级数据映射和查询在NHibernate中,实体映射以及高级查询是两个比较重要的模块。

实体映射用来实现代码对象与数据库对象的复杂映射关系。

而高级查询中,通过查询规则和过滤等接口,实现对数据的查询操作。

8.1 实体映射实体映射是指多个对象或者多个数据表之间的一种关系。

在NHibernate中,实体映射包括一对一、多对一以及多对多三种映射模式。

本节中通过实例逐一介绍这三种实体映射。

在各个实例中,需要创建对于映射的数据表。

注意:在NHibernate中,不同的业务场景需要采用不同的映射方案,而对于不同的映射,配置文件也会相应采用不同的配置键。

【本节数据库建库脚本参考:\示例代码\C12\CreateTable.sql】8.1.1 一对一映射在数据库中的两个表中,通过某一字段进行关联,该字段是两个表的主键。

说明:一对一的映射关系如人员表和人员信息详细表信息,人员主表介绍了人的基本信息,而人员子表信息介绍了一些辅助的信息。

但二表都是描述相同的一个实体。

本节实例中,通过人员基本信息表和人员辅助信息表来描述一对一的映射关系。

对应的数据库表之间的关系如图8.1所示。

图8.1 一对一映射数据表关系下面通过实例介绍如何在程序中实现一对一的映射关系。

【本节示例参考:\示例代码\C12\NHMappingOne2One】(1)创建实例数据库和实例表,对应的SQL创建脚本如下代码所示。

说明:该SQL脚本是用来创建后续几种映射对应的数据库表结构,由于映射需要针对不同的业务场景,所以下面表结构会根据不同映射设计出来的。

USE master;GOIF DB_ID (N'NHDemo') IS NOT NULLDROP DATABASE NHDemo;GOCREATE DATABASE NHDemo;GOUSE [NHDemo]GO/****** Object: Table [dbo].[Person] Script Date: 07/13/2007 13:32:55 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE [dbo].[Person]([PersonId] [int] IDENTITY(1,1) NOT NULL,[Name] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED(ASC[PersonId])WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]GOSET ANSI_PADDING OFFUSE [NHDemo]GO/****** Object: Table [dbo].[PersonDetailInfo] Script Date: 07/13/2007 13:33:02******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [dbo].[PersonDetailInfo]([PersonId] [int] NOT NULL,[Address] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,CONSTRAINT [PK_PersonDetailInfo] PRIMARY KEY CLUSTERED([PersonId] ASC)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]GO ALTER TABLE [dbo].[PersonDetailInfo] WITH CHECK ADD CONSTRAINT[FK_PersonDetailInfo_Person] FOREIGN KEY([PersonId]) REFERENCES [dbo].[Person] ([PersonId])GO ALTER TABLE [dbo].[PersonDetailInfo] CHECK CONSTRAINT [FK_PersonDetailInfo_Person](2)创建一个控制台项目,命名为NHMappingOne2One 。

利用轻量对象关系映射技术Hibernate提高开发效率

利用轻量对象关系映射技术Hibernate提高开发效率

利用轻量对象关系映射技术Hibernate提高开发效率 Enhancing Development Efficiency with Hibernate a LightweightObject/Relational Mapping Technology谢挺 周维民(上海大学机电工程与自动化学院,上海 200072)摘 要 Hibernate是一种轻量对象关系映射技术。

文章通过实例,介绍了Hibernate的一些关键特性,并阐述了该技术的一些局限性。

关键词 Hibernate 对象关系映射企业级JavaBeans 持久化Abstract Hibernate is a lightweight Object/Relational Mapping(ORM) technology. Some key features of Hibernate are illustrated, and some limits of this technology are expounded.Keywords Hibernate Object/Relational Mapping (ORM) EJB Permanence0 引言随着internet的发展,应用服务程序已经从集中式、C/S模式过渡到B/S、分布式模式;无论是用户或是供应商都迫切希望缩短开发周期、提高开发效率,Hibernate应运而生。

1 Hibernate简介Hibernate是一个面向Java环境的对象/关系数据库映射工具。

对象/关系数据库映射(Object/Relational Mapping , ORM)这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型中去。

Hibernate不仅提高Java类到数据库的映射,还提供数据查询和获取数据的方法。

Hibernate在英语中的意思是“冬眠”,顾名思义它使得商务逻辑的开发和数据库最大程度地分离,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。

对象关系映射的原理与实现

对象关系映射的原理与实现

对象关系映射的原理与实现对象关系映射(ORM)是一种将数据存储在关系型数据库中的对象与编程语言中的对象之间进行转换的技术。

它实现了数据库和应用程序之间的数据交互,并在数据库操作和对象操作之间建立了一层抽象层。

ORM的主要目的是减少开发人员在编写数据库相关代码时的工作量,提高开发效率。

ORM的实现原理主要包括对象映射、关系映射和数据访问层。

首先,ORM将数据库中的表与应用程序中的类进行映射,通过定义类的属性来映射数据库表的列,通过定义类的方法来操作数据库表的数据。

这样,应用程序就可以像操作普通对象一样操作数据库中的数据。

其次,ORM要将关系型数据库中的表之间的关系转化为对象之间的关系。

在关系型数据库中,表之间的关系通过外键来实现,而在面向对象编程中,关系通过类之间的关联实现。

ORM会自动根据表之间的外键关系生成对象之间的关联关系,并提供相应的方法来操作这些关联关系。

例如,一个订单对象可以关联多个商品对象,在ORM中可以使用一个列表属性来表示订单与商品之间的关系。

最后,ORM提供了数据访问层,用于处理数据库查询、更新、删除等操作。

ORM会将应用程序中的数据操作转化为相应的SQL语句,然后通过数据库连接来执行这些SQL语句,并将结果返回给应用程序。

通过数据访问层,开发人员可以方便地使用面向对象的方式操作数据库,而无需直接编写SQL语句。

ORM的实现通常需要用到反射和元数据技术。

反射可以动态地获取类的属性和方法,并对其进行操作,从而实现将数据库表与类进行映射。

元数据可以提供关于类和表之间映射关系的信息,如字段名、数据类型、约束条件等,从而可以实现将关系型数据库中的表与应用程序的类进行关联。

在实际应用中,常见的ORM框架有Hibernate、Django ORM、Sequelize等。

这些框架提供了一系列的类和方法来实现ORM的功能,并提供了相应的配置文件用于定义数据库连接和映射关系。

总的来说,ORM通过将关系型数据库中的表与应用程序中的类进行映射,实现了数据库操作与对象操作之间的转换,从而减少了开发人员的工作量,提高了开发效率。

浅析Java对象持久化:Hibernate的几种关系映射与配置

浅析Java对象持久化:Hibernate的几种关系映射与配置

t pe y பைடு நூலகம்
/ /Hi e a e Hi e ae C n i u a b m t / b m t o fg r
nam e= ” s r pt on” de c i i cl o umn:” e crp i n” d s i to t e ”t i yp = s rng” />
to i n DTD 3 0 / . / EN” ” tp: / i e n t s ur e o g . e / h t / h b r a e.o c f r e n t
开 发 人 在 企 业 应 用 和 关 系 数 据 库 之 问 的 首 持 久 化 , 如 何 合 理 的 进 行 J a对 象 与 关 系 v a 数据 库 之 间 的 关 系映 射 是 关键 所 在 。
</i d>
<pr ope t nam e ” ry = name”
n m = a e ” n a m e ”
Q et n u si o col m n 一 ”n u a m e” t e = ’t i yp ’ rng” /> s
< P P ro e rt Y
P K i d q e to u s n i
0 缸 nS 0 0
hi e n t c fg r to b r a e on i u a i n~3. dt > 0. d”
<hi r a e o i r ton> e b n t c nfg a i u <s s i n a t r n e s o f c o y ame mys ” =” ql > <pr p r y a e-” i l c ” o e t n m - d a e t >
持久化 中间件 ,自2 0 0 5年荣获第 1 Jl 5届 ot 大奖 , 已成为 众多的 J v a a开 发人 员开发企

hbm原理

hbm原理

hbm原理Hibernate映射文件(HBM)原理解析HBM(Hibernate映射文件)是Hibernate框架中重要的组成部分,用于映射Java类与数据库表之间的关系。

它提供了一种将对象模型与关系模型进行转换的机制,使得开发人员可以使用面向对象的方式操作数据库。

本文将对HBM原理进行详细解析,帮助读者更好地理解和应用Hibernate框架。

一、HBM文件的基本结构HBM文件通常以.hbm.xml作为文件后缀,采用XML格式描述。

它包含了数据库表和Java类之间的映射关系及其属性信息。

一个典型的HBM文件由根元素<hibernate-mapping>包裹,内部包含了<class>、<id>、<property>等元素来定义映射关系。

1. <class>元素:用于描述Java类与数据库表之间的映射关系。

它的name属性指定了Java类的全限定名,table属性指定了对应的数据库表名。

2. <id>元素:用于定义主键映射关系。

它的name属性指定了Java 类中对应的主键属性名,column属性指定了对应的数据库列名,type属性指定了主键属性的数据类型。

3. <property>元素:用于描述普通属性的映射关系。

它的name属性指定了Java类中对应的属性名,column属性指定了对应的数据库列名,type属性指定了属性的数据类型。

二、HBM文件中的映射关系HBM文件中的映射关系有三种类型:一对一、一对多和多对多。

下面将分别进行详细介绍。

1. 一对一关系:指的是一个Java类的对象与另一个Java类的对象之间的关系。

在HBM文件中,一对一关系可以通过<one-to-one>元素来定义。

它的name属性指定了Java类中对应的属性名,class 属性指定了关联的Java类名。

2. 一对多关系:指的是一个Java类的对象与多个另一个Java类的对象之间的关系。

Hibernate_映射配置文件详解

Hibernate_映射配置文件详解
–hibernate.properties –hibernate.cfg.xml
Prepared by TongGang
hibernate.cfg.xml的常用属性
• • • • • • • • • connection.url:数据库URL ername:数据库用户名 connection.password:数据库用户密码 connection.driver_class:数据库JDBC驱动 show_sql:是否将运行期生成的SQL输出到日志以供调试。取 show_sql 值 true | false dialect:配置数据库的方言,根据底层的数据库不同产生不 dialect 同的sql语句,Hibernate 会针对数据库的特性在访问时进行 优化。 hbm2ddl.auto:在启动和停止时自动地创建,更新或删除数据 hbm2ddl.auto 库模式。取值 create | update | create-drop resource:映射文件配置,配置文件名必须包含其相 mapping resource 对于根的全路径 connection.datasource :JNDI数据源的名称
• Class:定义一个持久化类 Class: • name (可选): 持久化类(或者接 (可选): 持久化类( 可选 口)的类名 • table (可选 - 默认是类的非全限 (可选 定名): 定名): 对应的数据库表名 • discriminator-value (可选 - 默 discriminator(可选 认和类名一样): 认和类名一样): 一个用于区分不 同的子类的值,在多态行为时使用。 同的子类的值,在多态行为时使用。 它可以接受的值包括 null 和 not null。 null。
Prepared by TongGang

hibernate createnativequery 使用

hibernate createnativequery 使用

hibernate createnativequery 使用Hibernate CreateNativeQuery 使用指导Hibernate是一个流行的Java持久化框架,它提供了一种方便的方式来将对象模型映射到关系数据库中。

除了支持HQL(Hibernate Query Language)查询,Hibernate还允许开发人员直接执行原生的SQL查询。

这对于在特定情况下需要执行复杂查询或优化性能时非常有用。

本文将介绍Hibernate的CreateNativeQuery方法的使用,一步一步地回答常见的问题。

什么是CreateNativeQuery?CreateNativeQuery是Hibernate的一个方法,它允许开发人员执行原生的SQL查询。

它接受一个SQL查询字符串作为参数,并返回一个NativeQuery对象,可以使用该对象来执行查询并获取结果。

如何使用CreateNativeQuery?以下是使用CreateNativeQuery的基本步骤:步骤1: 获取Hibernate Session要执行SQL查询,首先需要通过Hibernate获取一个Session对象。

Session是Hibernate的核心接口之一,它表示与数据库的连接和数据读写操作。

例子:javaSession session = HibernateSessionFactory.getSession();步骤2: 创建原生SQL查询使用session对象的CreateNativeQuery方法来创建一个NativeQuery 对象。

该方法接受一个SQL查询字符串作为参数。

例子:javaString sql = "SELECT * FROM users WHERE age > :age"; NativeQuery<User> query = session.createNativeQuery(sql, User.class);在上面的例子中,我们创建了一个查询,用于选择年龄大于给定参数age的用户。

hibernate的manytoone和onetomany用例 -回复

hibernate的manytoone和onetomany用例 -回复

hibernate的manytoone和onetomany用例-回复Hibernate是一个Java的持久化框架,常用于开发数据访问层的代码。

它提供了一种简化数据库操作的方法,可以通过对象和关系数据库进行交互。

在Hibernate中,常用的关系映射包括many-to-one和one-to-many。

本文将通过详细讲解这两种关系映射的用例来帮助读者更好地理解和使用Hibernate。

首先,我们来了解一下many-to-one关系映射。

这种映射关系表示一个实体对象(通常是较"多"的一方)可以与另一个实体对象(通常是较"一"的一方)建立多对一的关系。

在关系数据库中,这种关系通过外键实现。

在Hibernate中,我们可以通过注解或XML配置来映射这种关系。

假设我们要建立一个简单的图书和作者的many-to-one关系映射。

一个作者可以写多本图书,而一本图书只能由一个作者所写。

我们先创建一个Author类和一个Book类。

Author类包含作者的姓名、年龄等属性,并与多个Book对象建立关联,通过"books"字段来表示与图书的关系。

Book 类包含图书的名字、出版日期等属性,并通过"author"字段与一个Author 对象建立关联,表示与作者的关系。

javapublic class Author {private Long id;private String name;private int age;private List<Book> books;省略getter和setter方法}public class Book {private Long id;private String name;private LocalDate publishDate;private Author author;省略getter和setter方法}在Author类中,我们可以使用OneToMany注解来建立与Book对象的关联,并通过设置cascade属性来实现级联操作。

hibernate项目开发的一般步骤

hibernate项目开发的一般步骤

Hibernate 是一个开源的对象关系映射(ORM)框架,它可以将 Java 对象映射到关系型数据库中。

使用 Hibernate 进行项目开发的一般步骤如下:
1. 配置 Hibernate:首先需要在项目中添加 Hibernate 的相关依赖,并在配置文件中进行相关配置,如连接数据库的 URL、用户名和密码等。

2. 创建实体类:根据数据库表的结构,创建相应的 Java 实体类。

这些类需要继承自Hibernate 的某个抽象类或接口,并包含相应的属性和注解。

3. 创建映射文件:为每个实体类创建一个映射文件,用于描述实体类与数据库表之间的映射关系。

映射文件通常是以`.hbm.xml`为扩展名的文件。

4. 编写 DAO 类:使用 Hibernate 提供的 API 编写数据访问对象(DAO)类,用于对数据库进行操作。

DAO 类通常包含用于插入、更新、删除和查询数据的方法。

5. 编写业务逻辑:在服务层编写业务逻辑代码,调用 DAO 类进行数据库操作。

6. 测试:编写测试代码,对业务逻辑进行测试。

7. 部署和运行:将项目部署到服务器上,并运行应用程序。

需要注意的是,在使用 Hibernate 进行项目开发时,需要遵循一些最佳实践,如延迟加载、缓存优化等,以提高系统的性能和可维护性。

以上是使用 Hibernate 进行项目开发的一般步骤,具体的步骤和实现方式可能因项目的需求和架构而有所不同。

Hibernate的工作原理

Hibernate的工作原理

Hibernate的工作原理Hibernate是一个开源的Java持久化框架,它能够将Java对象映射到关系型数据库中,并提供了一套简单而强大的API,使得开辟人员能够更加方便地进行数据库操作。

Hibernate的工作原理主要包括以下几个方面:1. 对象关系映射(ORM):Hibernate使用对象关系映射技术将Java对象与数据库表之间建立起映射关系。

开辟人员只需要定义好实体类和数据库表之间的映射关系,Hibernate就能够自动地将Java对象持久化到数据库中,或者将数据库中的数据映射成Java对象。

2. 配置文件:Hibernate通过一个配置文件来指定数据库连接信息、映射文件的位置以及其他一些配置信息。

配置文件通常是一个XML文件,其中包含了数据库驱动类、连接URL、用户名、密码等信息。

开辟人员需要根据自己的数据库环境进行相应的配置。

3. SessionFactory:Hibernate的核心组件是SessionFactory,它负责创建Session对象。

SessionFactory是线程安全的,通常在应用程序启动时创建一次即可。

SessionFactory是基于Hibernate配置文件和映射文件来构建的,它会根据配置文件中的信息来创建数据库连接池,并加载映射文件中的映射信息。

4. Session:Session是Hibernate的另一个核心组件,它代表了与数据库的一次会话。

每一个线程通常会有一个对应的Session对象。

Session提供了一系列的方法,用于执行数据库操作,如保存、更新、删除、查询等。

开辟人员通过Session对象来操作数据库,而不直接与JDBC打交道。

5. 事务管理:Hibernate支持事务的管理,开辟人员可以通过编程方式来控制事务的提交或者回滚。

在Hibernate中,事务是由Session来管理的。

开辟人员可以通过调用Session的beginTransation()方法来启动一个事务,然后根据需要进行提交或者回滚。

经典heibernate教程,从入门到精通

经典heibernate教程,从入门到精通

• 什么是ORM?
ORM(对象-关系映射): ORM(对象-关系映射): 完成对象数据到关系型数据映射的 完成对象数据到关系型数据映射的 机制称为对象-关系映射,简称 机制称为对象-关系映射,简称 ORM。 ORM。 映射信息 映射信息
类: User 属性 name sex pw 表: TBL_User 字段 user_name user_sex user_pw
使用Hibernate实现:
配置Hibernate关联自动加载区县对应的街道 配置Hibernate关联并实现:
1、增加一个公司:“CSTP” 2、增加CSTP下属的三个部门 3、删除“教学” 4、划“财务”到红旗渠 5、删除红旗渠
– 配置Hibernate多对多关联,实现某OA系统项 目和人员对照关系的管理
1configuration7关闭session2创建sessionfactory6提交事务54开始一个事务3打开session持久化操作saveupdatedeletefind创建和销毁都相当耗费创建和销毁都相当耗费资源通常一个系统内资源通常一个系统内一个数据库只创建一个一个数据库只创建一个类似于jdbc中的类似于jdbc中的connectionconnectionconfigurationconfiguration创建hibernatecfgxmlhibernatecfgxmlfwxxcfgxmluserhbmfwxxcfgxmluserhbmxml开始transactiontransactionsessionfactorysessionfactory创建sessionsession执行复杂的查询操作稍后介绍复杂的查询操作稍后介绍savedeleteupdategettxcommitsessionclose结束结束sessionsessionsfopensession

hibernate 生成数据库表的原理

hibernate 生成数据库表的原理

hibernate 生成数据库表的原理Hibernate是一个Java持久化框架,它提供了一种方便的方式来映射Java对象到关系数据库中的表结构。

当使用Hibernate时,它可以根据预定义的映射文件或注解配置自动创建、更新和管理数据库表。

Hibernate生成数据库表的原理如下:1. 对象关系映射(Object-Relational Mapping,ORM):Hibernate使用ORM技术将Java类和关系数据库表之间建立起映射关系。

通过在实体类中定义注解或XML映射文件,Hibernate可以知道哪个Java类对应哪个数据库表以及类中的属性与表中的列之间的映射关系。

2. 元数据分析:当应用程序启动时,Hibernate会对实体类进行元数据分析。

它会扫描实体类中的注解或XML映射文件,获取实体类的名称、属性名、属性类型等信息,并根据这些信息生成相应的元数据。

3. 数据库模式生成:根据元数据,Hibernate可以自动生成数据库表的DDL语句。

它会根据实体类的名称创建表名,根据属性名创建列名,并根据属性类型确定列的数据类型、长度、约束等。

生成的DDL语句可以包括创建表、添加索引、外键约束等操作。

4. 数据库表管理:Hibernate可以根据生成的DDL语句来创建数据库表。

在应用程序启动时,Hibernate会检查数据库中是否已存在相应的表,如果不存在则创建表;如果已存在但结构与元数据不匹配,则根据需要进行表结构的更新或修改。

总的来说,Hibernate生成数据库表的原理是通过分析实体类的元数据,自动生成对应的DDL语句,并根据需要创建、更新和管理数据库表。

这种自动化的方式大大简化了开发人员的工作,提高了开发效率。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Hibernate关系映射Hibernate关联关系映射【实验目标】完成本章的内容以后,您将达到:◆Hibernate中实体的三种状态以及它们的特点和状态的转换◆学会manyToOne、oneToMany 、manyToMany的关系映射。

◆掌握用关系映射操纵关系及要注意的问题<<j2ee-ssh>>实验手册第一阶段——练习测试对象的三种状态(transient、persistence、detach)及转换:(ora.sql经过调整,在里面创建了四个sequence fwxx_seq , user_seq , jd_seq , qx_seq需要在映射文件FwUser.hbm.xml中调整如下配置,重新指定sequence为user_seq:<id name="fwuid" column="fwuid"><generator class="native"><param name="sequence">user_seq</param></generator></id>)1、建立测试类HibObjectState(带main方法),首选在main方法中实现添加用户小花的功能,代码如下:(注意注释)package com.bu3g.hib.test;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import com.bu3g.entity.FwUser;import com.bu3g.hib.sessionfactory.HibernateSessionFactory;public class HiObjectState {/***@param args*/public static void main(String[] args) {// TODO自动生成方法存根Hibernate关系映射Session ses = HibernateSessionFactory.getSession();Transaction tx = null;try{tx = ses.beginTransaction();// transientFwUser user = new FwUser();user.setUname("xiaohua");user.setUpass("123");//user is persistenceses.save(user);user.setUpass("555"); //持久对象的变化会同步到数据库的对应的记录mit();ses.close();}catch(Exception e){tx.rollback();}}}运行程序(对象经历两个状态:瞬时状态和持久状态),观察:控制台输出两个sql,分别为:insert (save()方法产生),update语句(在事务提交时,为同步持久对象的修改到数据库而产生的).在pl/sql中查询: select * from tbl_user where uname=’xiaohua’比较它的密码是123,还是5552、继续在main方法中添加如下代码(红色部分:)public static void main(String[] args) {Session ses = HibernateSessionFactory.getSession();Transaction tx = null;try{tx = ses.beginTransaction();// transientFwUser user = new FwUser();user.setUname("xiaohua");user.setUpass("123");<<j2ee-ssh>>实验手册//user is persistenceses.save(user);user.setUpass("555"); //持久对象的变化会同步到数据库的对应的记录mit();ses.close();//user is detachuser.setUpass("888"); //游离对象不会与数据库同步}catch(Exception e){tx.rollback();}}在数据库中查询:select * from tbl_user where uname=’xiaohua’看看密码是否为555,如不是想想为什么?3、在main中继续加入代码(红色部分):public static void main(String[] args) {// TODO自动生成方法存根Session ses = HibernateSessionFactory.getSession();Transaction tx = null;try{tx = ses.beginTransaction();// transientFwUser user = new FwUser();user.setUname("xiaohua");user.setUpass("123");//user is persistenceses.save(user);user.setUpass("555"); //持久对象的变化会同步到数据库的对应的记录mit();ses.close();//user is detachuser.setUpass("888"); //游离对象不会与数据库同步//调用session的update()方法,才能将游离对象的变化同步到数据库中,//并且,update()方法执行后,会将游离对象变为持久Hibernate关系映射ses = HibernateSessionFactory.getSession();tx = ses.beginTransaction();//user is persistence//注:在同一事务过程中对同一个持久对象做多次更新,只会发一条update ses.update(user);user.setUname("xiaohua2");//user is transientses.delete(user);//user.setUname("xiaohua3");mit();}catch(Exception e){tx.rollback();}}在数据库中输入select * from tbl_user where uname=’xiaohua2’,看看是否有这条记录,若有再看看密码是否888,思考用户名为什么不为xiaohua3?第二阶段——练习:Jd 和Qx对象间建立多对一和一对多的关联,并将这种关联映射到tbl_jd和tbl_qx的多对一的外键关联上来.一、建立Jd到Qx的多对一的关联,并映射到tbl_jd和tbl_qx的外键关联:即:ManyToOne映射从多方并完成以下任务:1、获取街道”北京大学”及”所在区县”:2、建立“山南区”,建立“和平路”,建立“五四路”,建立“八一路”,将和平路、五四路、八一路划入到山南区删除五四路<<j2ee-ssh>>实验手册1-1:建立实体类com.bu3g.entity.Qx:package com.bu3g.entity;public class Qx {private int qxid;private String qx;public String getQx() {return qx;}public void setQx(String qx) {this.qx = qx;}public int getQxid() {return qxid;}public void setQxid(int qxid) {this.qxid = qxid;}}1-2:建立实体类com.bu3g.entity.Jd,通过声明Qx类型的成员,建立Jd->Qx的多对一的对象关联:ackage com.bu3g.entity;public class Jd {private int jdid;private String jd;private Qx qx ;public String getJd() {return jd;}public void setJd(String jd) {this.jd = jd;}public int getJdid() {return jdid;}public void setJdid(int jdid) {this.jdid = jdid;}public Qx getQx() {return qx;Hibernate关系映射}public void setQx(Qx qx) {this.qx = qx;}}1-3:在包com.bu3g.entity下建立实体类Qx与表tbl_qx的映射(Qx.hbm.xml):<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "/hibernate-mapping-3.0.dtd" > <hibernate-mapping><class name="com.bu3g.entity.Qx" table="tbl_qx"><id name="qxid" column="qxid"><generator class="native"><param name="sequence">qx_seq</param></generator></id><property name="qx" column="qx"></property></class></hibernate-mapping>1-4:包com.bu3g.entity下建立实体类Jd与tbl_jd的映射(Jd.hbm.xml),并在该映射文件中实现J将d->Qx的多对一的对象关联,映射为表tbl_jd->tbl_qx的外键关联(红色部分) ?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "/hibernate-mapping-3.0.dtd" > <hibernate-mapping><class name="com.bu3g.entity.Jd" table="tbl_jd"><id name="jdid" column="jdid"><generator class="native"><param name="sequence">jd_seq</param></generator></id><property name="jd" column="jd"></property><many-to-one name="qx" class="com.bu3g.entity.Qx"column="qxid" ></many-to-one></class><<j2ee-ssh>>实验手册</hibernate-mapping>1-5:映射做好后实现如下功能:从数据库中加载街道”北京大学”,并同时加载它所在的区县:1-5-1:建立ManyToOne类(带main方法),代码如下:package com.bu3g.hib.test;import org.hibernate.Session;import org.hibernate.Transaction;import com.bu3g.entity.Jd;import com.bu3g.entity.Qx;import com.bu3g.hib.sessionfactory.HibernateSessionFactory;public class ManyToOne {/***@param args*/public static void main(String[] args) {// TODO自动生成方法存根ManyToOne test = new ManyToOne();test.test1();}/***获取街道'北京大学',同时得到'北京大学'所在的区县**/public void test1(){Session ses = HibernateSessionFactory.getSession();Jd beijingdaxue = (Jd)ses.get(Jd.class, 2);//Hibernate在查询对象时,同时也自动将对象的关联对象也查询出来System.out.println("街道:"+beijingdaxue.getJd()+",所在区县:"+beijingdaxue.getQx().getQx());}}运行,得到结果:"街道:北京大学,所在区县:海淀区观察控制台中输出的sql语句有哪些,思考它们的作用?.Hibernate关系映射1-5-2:建立testAdd1()成员方法如下,实现前面规定的功能:建立“山南区”,建立“和平路”,建立“五四路”,建立“八一路”,将和平路、五四路、八一路划入到山南区代码如下:public void testAdd1(){Session ses = HibernateSessionFactory.getSession();Transaction tx = null;try{tx = ses.beginTransaction();//增加山南区Qx shangnan = new Qx();shangnan.setQx("山南区");ses.save(shangnan);//增加三个街道:和平路、五四路、八一路Jd heping = new Jd();heping.setJd("和平路");ses.save(heping);Jd wusi = new Jd();wusi.setJd("五四路");ses.save(wusi);Jd bayi = new Jd();bayi.setJd("八一路");ses.save(bayi);//将三个街道加入到山南区,heping.setQx(shangnan);wusi.setQx(shangnan);bayi.setQx(shangnan);mit();}catch(Exception e){if(tx != null){tx.rollback();}e.printStackTrace();<<j2ee-ssh>>实验手册}finally{ses.close();}}更改main方法如下:public static void main(String[] args) {// TODO自动生成方法存根ManyToOne test = new ManyToOne();test.testAdd1();}运行,观察控制台中的sql语句,思考它们各自作用?heping.setQx(shangnan); wusi.setQx(shangnan);bayi.setQx(shangnan);三行代码的作用是:将分别将heping、wusi、bayi关联到了区县对象shangnan,思考这三行语句实现的对象关联关系的变化对数据库产生了什么影响?(在数据库中执行四条查询语句:Select * from tbl_qx where qx=’山南区’;Select * from tbl_jd where jd=’和平路’;Select * from tbl_jd where jd=’五四路’;Select * from tbl_jd where jd=’八一路’;)在数据库执行如下sql语句,删除以前插入的数据:(delete from tbl_qx where qx=’山南区’;delete from tbl_jd where jd=’和平路’;delete from tbl_jd where jd=’五四路’;delete from tbl_jd where jd=’八一路’;commit;)1-5-3:建立成员方法testAdd2(),实现与testAdd1()相同功能,但过程做了调整,代码如下:public void testAdd2(){Session ses = HibernateSessionFactory.getSession();Transaction tx = null;try{tx = ses.beginTransaction();//增加山南区Qx shangnan = new Qx();shangnan.setQx("山南区");Hibernate关系映射ses.save(shangnan);//增加三个街道:和平路、五四路、八一路, 并将三个街道加入到山南区 Jd heping = new Jd();heping.setJd("和平路");heping.setQx(shangnan);ses.save(heping);Jd wusi = new Jd();wusi.setJd("五四路");wusi.setQx(shangnan);ses.save(wusi);Jd bayi = new Jd();bayi.setJd("八一路");bayi.setQx(shangnan);ses.save(bayi);mit();}catch(Exception e){if(tx != null){tx.rollback();}e.printStackTrace();}finally{ses.close();}}更改main方法如下:public static void main(String[] args) {// TODO自动生成方法存根ManyToOne test = new ManyToOne();test.testAdd2();}运行,观察的控制台的sql语句输出,发现比testAdd1()少用了三条update语句,效率更高。

相关文档
最新文档