hibernate——一对一、多对一和多对多关系的比较

hibernate——一对一、多对一和多对多关系的比较
hibernate——一对一、多对一和多对多关系的比较

现在学习完了这几种映射关系,但是有点乱,这里来小结一下。关键是表之间如何产生映射关系,以及产生的表的结构。

1、一对一映射:

一对一是通过one-to-one标签来产生映射关系的,其实,如果单单说是建立两个表之间的关联,只要在一个映射文件中配置one-to-one标签就可以了,在另一个映射文件中,也做类似的配置,只会起到关联的作用,建立起双向的关联。这里举Person和IdCard的例子,IdCard类的映射文件如下:

[html]view plaincopyprint?

1.

2.

3.

4.

5.

6.

7.

constrained="true"指定了将person表的主键设置为id_card表的外键,这样就建立起了两个表的关联,若不指定,两个表就是孤立的,互相没有关系。

建立表的ddl语句如下:

[sql]view plaincopyprint?

1.CREATE TABLE `id_card` (

2. `id` int(11) NOT NULL AUTO_INCREMENT,

3. `No` varchar(255) DEFAULT NULL,

4. PRIMARY KEY (`id`),

5. KEY `FK627C1FB4AEED3EC` (`id`),

6. CONSTRAINT `FK627C1FB4AEED3EC` FOREIGN KEY (`id`) REFERENCES `person`

(`id`)

7.) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gbk

在Person类的映射文件中可以不指定one-to-one标签,但那样建立起来的是单向的映射关系,即从id_card表可以映射到person表,但是反之就不行。这在通过person表查询id_card 表时,不能查询。如果要让person关联到id_card那么就要在Person类的映射文件中,也配置一下one-to-one标签了。

2、多对一映射:

建立两个表的映射的关系,都是通过建立外键来关联的,多对一也不例外,例如员工和部门的关系属于多对一的关系,多个员工属于同一个部门,所以在部门类中要有一个员工的集合属性。要实现双向映射的话,还必须在员工类中有部门的属性。如果单单建立两个表之间的关联,也像一对一一样,只需要在一个映射文件中配置就可以了,但是,多对一的映射文件的配置不像一对一那样简单,相对复杂的是在“一”这个角色,不是只使用一个就可以了的,看下面这个配置“一”角色的例子:

[html]view plaincopyprint?

1.部门类的映射文件:

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

它是配置了一个set标签,在标签中指定了要关联的类和在要关联类中的外键。“一”这一方是通过这种方式建立和“多”的关联的。那么,要是用“多”那一方怎么建立关联呢?看下例:[html]view plaincopyprint?

1.员工类的映射文件:

2.

3.

4.

5.

6.

7.

8.

9.

使用标签也可以建立起和部门表的关联,而且这种方式要简洁很多。不管用哪种方式建立关联,所得的数据库的结果是一样的,如本例中,建立的员工表的ddl语句为:[sql]view plaincopyprint?

1.CREATE TABLE `employee` (

2. `id` int(11) NOT NULL AUTO_INCREMENT,

3. `name` varchar(255) DEFAULT NULL,

4. `depart_id` int(11) DEFAULT NULL,

5. PRIMARY KEY (`id`),

6. KEY `FK4AFD4ACE972E0614` (`depart_id`),

7. CONSTRAINT `FK4AFD4ACE972E0614` FOREIGN KEY (`depart_id`) REFERENCES

`department` (`id`)

8.) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=gbk

3、多对多映射:

因为是多对多的关系,只用两个表是无法表示这种关系的,所以建立出来第三方表,只保存这两个表之间的关系,这样就把多对多映射转换成了两个多对一映射。如果单单是建立两个表之间的关联,和上两种情况一样,只需要在其中一个映射文件中配置即可,但是要建立双向映射的话,就要在两个映射文件中都配置关联了。

这里我们举老师和学生的例子,他们的映射文件分别如下:

[html]view plaincopyprint?

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

[html]view plaincopyprint?

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

是不是看起来和多对一的映射文件有些类似?但是,不同的是,这里出现了第三个表:teacher_student,表中只有两列:teacher_id和student_id,并且分别是teacher和student 表的外键,建立的teacher_student表就是老师和学生表之间的关联,其建立的ddl语句为:[sql]view plaincopyprint?

1.CREATE TABLE `teacher_student` (

2. `teacher_id` int(11) NOT NULL,

3. `student_id` int(11) NOT NULL,

4. PRIMARY KEY (`student_id`,`teacher_id`),

5. KEY `FK2E2EF2DEDE6A927E` (`teacher_id`),

6. KEY `FK2E2EF2DECDCF47DE` (`student_id`),

7. CONSTRAINT `FK2E2EF2DECDCF47DE` FOREIGN KEY (`student_id`) REFERENCES

`student` (`id`),

8. CONSTRAINT `FK2E2EF2DEDE6A927E` FOREIGN KEY (`teacher_id`) REFERENCES

`teacher` (`id`)

9.) ENGINE=InnoDB DEFAULT CHARSET=gbk

通过上面的总结,应该清楚以下几个问题:

1、如果说单单建立两个表之间的关联,在其中一个映射文件中配置关联就可以了,就能够在数据库中生成外键,建立关联。

2、虽说在一个映射文件中就可以建立两个表的关联,但是不同的映射关系在不同的映射文件中,配置的方法是不同的。

3、若要建立双向的关联的话,就要在两个映射文件中都进行关联配置。

Hibernate配置文件的DTD

Hibernate中有两个配置文件 映射文件Xxx.hbm.xml 映射文件的的文件头DTD文件内容:

配置文件hibernate.cfg.xml 配置文件的文件头DTD文件内容: org.hibernate.dialect.MySQLDialect com.mysql.jdbc.Driver jdbc:mysql://localhost/minmin?characterEncoding=gb2312 root minmin true create

Hibernate练习题

Hibernate&EJB考试试题 1、下面关于Hibernate说法正确的是()(选择两项) A)Hibernate是ORM的一种实现方式 B)Hibernate不要JDBC的支持 C)属于控制层 D)属于数据持久层 2、下面关于ORM的说法错误的是()(选择两项) A)对象关系映射,让现实中的对象同数据库的表产生映射(类与表产生映射) B)对象关系映射,让类同表产生关系 C)对象关系映射,让类同记录产生关系(类的实例与记录(表中的一行数据)产生关系) D)对象关系映射,让类中的属性同表中的列产生关系 3、下面关于Hibernate中Session的说法正确的是()(选择两项) A)Session是轻量级的,可以随意的创建和销毁 B)Session是重量级的,不能随意的创建和销毁 C)Session是线程安全的 D)Session不是线程安全的 4、在Hibernate中,以下()不属于session的方法 A、close() B. open() C. update() D. delete() 5、下面关于Hibernate中load和get方法说法正确的是() A)这两个方法是一样的,没有任何的区别 B)这两个方法不一样,load先找缓存,再找数据库

C)这两个方法不一样,get先找缓存,再找数据库 D)以上说法都不对 注:load()和get()都是先找缓存,再找数据库。 不同点是在检索时: load()是延迟检索,先返回代理对象,访问对象时在发出sql命令Get()是立即检索,直接发出sql命令,返回对象 6、在Hibernate中修改对象的说话错误的是() A)只能利用update方法来做修改 B)可以利用saveOrUpdate方法来做修改 C)可以利用HQL语句来做修改 D)不能利用HQL语句来修改 7、下面关于Hibernate中Transaction的使用说法正确的是()(选择两项) A)Transaction是可有可无的 B)Transaction在做查询的时候是可有可无的 C)Transaction在做修改的时候是可有可无的 D)Transaction在做修改的时候是必须的 8、使用Hibernate技术实现数据持久化时,下面()内容不在 Hibernate配置文件中配置(选择一项) A) 数据库连接信息 B) 数据库类型(dialect) C) show_sql参数 D) 数据库表和实体的映射信息

经典表关联与多表查询

经典表关联与多表查询 目的: 1.掌握从多个表查询数据的基本知识 2.了解和学习外连接(out join) 3.掌握内连接 授课内容: 1.对多于一个表的数据查询 1.1现实情况中,在数据库应用中,数据存在于多个相关联的表中。基本上没有数据只 存在于一个表中的情况。小的应用系统一般也有十几个表,大型系统一般有上千个表。 1.2你经常要作的就是在多个表中进行数据查询。 1.3Oracle对多表查询使用表连接的技术(table join) 1.4表连接的基本条件: (1)2个表必须有公共字段(同名字段或不同名字段) (2)在一个表中,这个公共字段必须是主键(PK) 1.5二个表中的公共字段,在一个表中是主键,在另外一个表中就是外键(FK)。 1.6二表关联中,公共字段是主键的表称为父表(主表)。是外键的表称为子表(详细 表)。 1.7研究一下scott下的emp和dept表的关系。 1.8研究一下oe下的表: CATEGORIES_TAB CUSTOMERS INVENTORIES ORDERS ORDER_ITEMS PRODUCT_DESCRIPTIONS PRODUCT_INFORMATION 1.9多表查询的语法 select 子句 from 表1[ 别名],表2[ 别名],视图[ 别名],(select 子句)别名 where 连接语句 and 其他条件语句 [oupy by 分类项目] [having 子句] [order by 子句] 1.10任务:查询每个员工的编号,姓名,部门名称,部门位置 select empno,ename, dname,loc from emp a,dept b where=

持续集成测试

一、概念引入 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。 在敏捷开发中,有一个很重要的实践叫做持续集成。而什么是持续集成呢?简单来说,持续集成是频繁、持续的在多个团队成员的工作中进行集成,并且给与反馈。一个典型的持续集成周期包括以下几个步骤: 1.持续集成服务器不断从版本控制服务器上检查代码状态,看代码是否有 更新。 2.如果发现代码有最新的提交,那么就从版本控制服务器下载最新的代码。 3.等代码完全更新以后,调用自动化编译脚本,进行代码编译。 4.运行所有的自动化测试。 5.进行代码分析。 6.产生可执行的软件,能够提供给测试人员进行测试。 测试是持续集成流程中重要的一环,也是区别去传统的软件开发流程中的一个重要的标志。为什么要有持续集成测试呢? 每天,程序开发人员将各自开发的代码上传到配置管理工具(如SVN、VSS)中,而配置管理工具会记录下谁在什么时间上传了什么代码文件。随后,持续集成工具会定期(可以是几个小时、半天,或者一天,由使用者自己定义)向配置管理工具询问,从上一周期到现在是否有代码上传。如果有,则下载到持续集成工具中进行集成。之后,持续集成工具会调用构建工具代码编译、自动化测试,以及执行静态代码检查。如果这几项工作执行成功,则打包复制到应用服务器(如Weblogic)上执行重新发布,并形成代码检查与测试等报告;如果执行失败,则及时通过邮件通知管理者,并记录相关日志。 配置管理工具 毫无疑问,配置管理工具对持续集成工具来说是绝顶重要的,它是所有最新代码的来源。持续集成工具会定期向配置管理工具询问代码是否有更新。只有有了更新,持续集成工具才会去完成后续的工作,否则就没有了意义。目前在Java开发项目中,最主流的无疑是Subversion(简称SVN)。SVN是对CVS的升级,它通过插件的形式被集成到开发工具中,并且提供了更加方便的上传下载操作,使开发人员最厌恶的上传下载操作变得简便。SVN的另一个巨大贡献是改变了VSS 那样的串行修改模式。众所周之,VSS的版本管理思路就是串行修改模式,即对于同一个文件只能一个人修改,其他人不能修改。这样的模式对应大规模团队开发来说无疑是非常蹩脚的。SVN改变了这种模式,同一个文件可以多人并行操作,但同时SVN又提供了强大的版本冲突处理机制,当并行操作的多人各自提交版本时,通过版本冲突处理机制可以顺利的合并版本,使最终形成统一版本。

Hibernate3.6(开发必看)

1.Java对象持久化概述 1.1.应用程序的分层体系结构 1.1.1.基于B/S的典型三层架构 说明: 1,展现层:提供与用户交互的界面。 2,业务逻辑层:实现各种业务逻辑。 3,数据访问层:负责存放和管理应用程序的持久化业务数据。 1.1. 2.数据访问层与Hibernate在Java应用程序中的 角色 数据访问层(持久化层)封装了数据访问的细节,为业务逻辑层提供了面向对象的API。完善的持久化层应该达到的目标: 1,代码重用性高,可完成所有的数据访问操作。 2,如果需要的话,能够支持多种数据库平台。 3,具有相对独立性,当持久化层变化时,不会影响上层实现。 在数据访问层(持久化层)中可以使用Hibernate框架以实现要求,如下图所示:

1.2.软件模型 1.2.1.各种模型的说明 概念模型: 模拟问题域中的真实实体。描述每个实体的概念和属性及实体间关系。不描述实体行为。实体间的关系有一对一、一对多和多对多。。 关系数据模型: 在概念模型的基础上建立起来的,用于描述这些关系数据的静态结构。有以下内容组成:1,若干表 2,表的所有索引 3,视图 4,触发器 5,表与表之间的参照完整性

域模型: 在软件的分析阶段创建概念模型,在软件设计阶段创建域模型。 组成部分: 1,具有状态和行为的域对象。 2,域对象之间的关联。 域对象(domain object): 构成域模型的基本元素就是域对象。对真实世界的实体的软件抽象,也叫做业务对象(Business Object,BO)。域对象可代表业务领域中的人、地点、事物或概念。 域对象分为以下几种: 1,实体域对象:通常是指业务领域中的名词。(plain old java object,简单Java 对象)。 2,过程域对象:应用中的业务逻辑或流程。依赖于实体域对象,业务领域中的动词。如发出订单、登陆等。 3,事件域对象:应用中的一些事件(警告、异常)。 1.2.2.域对象间的关系 关联: 类间的引用关系。以属性定义的方式表现。

数据库表关系模型解析6——多对多

数据库表关系模型解析6——多对多 狼奔代码生成器是一款为程序员设计的前期开发辅助工具,是一个软件项目智能开发的平台,它可以自动生成https://www.360docs.net/doc/a19965143.html,页面及后台代码。 实践开发过程中,我们使用PowerDesigner设计数据库模型。狼奔代码生成器就是读取PowerDesigner设计的数据库模型,分析其中的表与表之间的关系模型,分析其中的表和字段的说明信息中的关键字,自动生成不同的页面。 表与表之间的关系模型包括 1.单表数据模型 2.自连接数据模型 3.一对一数据模型 4.一对多数据模型 5.一对多数据模型中的一张表是自连接 6.多对多数据模型 7.多对多数据模型中的一张表是自连接 关键字包括 1.查询 2.状态 3.上传 4.工作流

架构图 数据访问层(DAL) 数据实体Entity Framework 业务实体和校验元数据 业务逻辑层(BLL) 业务处理 工作流 事务 接口层(IBLL)服务契约 展示层(App )View (视图) Controller (控制器) Models (页面实体)对其他系统暴露服务Service (服务) 公共组件 安全组件 日志记录 异常捕获 公共类库(Common) 组件说明

图表1项目组件说明图 1)App——页面展示层 采用MVC框架,使用Jquery脚本库,控件选用Easyui。 2)WcfHost——服务宿主(后期扩展) 为对外的服务提供宿主,使用WCF技术,HTTPS通讯协议。 3)IBLL——业务接口层 业务逻辑层的方法对外暴露的接口和服务契约。 4)BLL——业务逻辑层 业务逻辑的操作,包括业务处理,事务,日志。 5)DAL——数据访问层 数据库访问的操作,数据实体,业务实体,数据校验,使用Entity Framework。6)Common——公共组件层 整个应用程序使用的公共辅助方法。 7)WFActivitys——工作流活动层(后期扩展) 定义了工作流需要的活动,使用微软WF技术。 8)WFDesigner——工作流设计器(后期扩展) 可以让实施人员自由配置工作流的设计器,使用微软WPF技术。 采购计划明细和分发的作用 业务需求:将采购计划明细中的物资分发到不同的站点 采购计划明细和分发之间有一张关联表,这三张表就构成了一个典型的“多对多数据模型” 下面我们以分发为例子分析“多对多数据模型”数据模型,代码已在生成的文件中,并且注释详备,此文不再赘述 数据模型 采购计划明细和分发之间是多对多的关系

hibernate面试题

1.Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory 为什么要用: 1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。 2.Hibernate是如何延迟加载? 1. Hibernate2延迟加载实现:a)实体对象b)集合(Collection) 2. Hibernate3 提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。 3.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、 4.说下Hibernate的缓存机制 1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存 2. 二级缓存: a) 应用及缓存 b) 分布式缓存 条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据 c) 第三方缓存的实现

多对多关系表

数据库建表-- 一对多/多对一/一对一/多对多关系 关联映射:一对多/多对一存在最普遍的映射关系,简单来讲就如球员与球队的关系;一对多:从球队角度来说一个球队拥有多个球员即为一对多多对一:从球员角度来说多个球员属于一个球队即为多对一数据表间一对多关系如下图: 关联映射:一对一关系就如球队与球队所在地址之间的关系,一支球队仅有一个地址,而一个地址区也仅有一支球队。数据表间一对一关系的表现有两种,一种是外键关联,一种是主键关联。图示如下: 一对一外键关联: 一对一主键关联:要求两个表的主键必须完全一致,通过两个表的主键建立关联关系 关联映射:多对多 多对多关系也很常见,例如学生与选修课之间的关系,一个学生可以选择多门选修课,而每个选修课又可以被多名学生选择。数据库中的多对多关联关系一般需采用中间表的方式处理,将多对多转化为两个一对多。 数据表间多对多关系如下图:

---------------------------------------------------------------------------------------------------------- 前言:多对多关系至少需要3个表,我们把一个表叫做主表,一个叫做关系表,另外一个叫做字典表或者副表(字典表是纪录比较少,而且基本稳定的,例如:版块名称;副表是内容比较多,内容变化的,例如)。按照数据库的增删查改操作,多对多关系的查找都可以用inner join或者 select * from 主表where id in (select 主表id from 关系表) 1,角色任命型 特点:关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键,有一个表是字典类型的表。 界面特点:显示主表,用checkbox或多选select设置多选关系。 例如:任命版主(用户表-关系表-版块名称表),角色权限控制等,用户是5个版块版主,只要关系表5行纪录就可以确立,关系表的两个外键具有联合主键性质。 增加关系:如果没有组合纪录,insert之。 删除关系:如果有组合纪录,删除之。 2,集合分组型 特点:同角色任命型类似,关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键。区别是主副表都不是字典表,可能都很大不固定。 界面特点:显示主表,用搜索代替简单的checkbox或多选select,或者一条一条的添加。 例如:歌曲专集(专集表-关系表-歌曲表)。手机分组(分组表-关系表-手机表)。用户圈子(圈子表-关系表-用户表)。文章标签(文章表-关系表-标签表) 增加关系:同版主任命型。 删除关系:同版主任命型。 3,明细帐型

JAVA复试问题答案

(一) JAVA复试的问题整理 1 Hibernate 的优化流程是如何实现的,流程是怎么样? 1.尽量使用many-to-one,避免使用单向one-to-many 2.灵活使用单向one-to-many 3.不用一对一,使用多对一代替一对一 4.配置对象缓存,不使用集合缓存 5.一对多使用Bag 多对一使用Set 6.继承使用显示多态 HQL:from object polymorphism="exlicit" 避免查处所有对象 7.消除大表,使用二级缓存 2 Struts1与Struts2的区别? 在Action 实现类方面的对比:Struts 1 要求Action 类继承一个抽象基类;Struts 1 的一个具体问题是使用抽象类编程而不是接口。Struts 2 Action 类可以实现一个Action 接口,也可以实现其他接口,使可选和定制的服务成为可能。Struts2 提供一ActionSupport 基类去实现常用的接口。即使 Action 接口不是必须实现的,只有一个包含execute 方法的POJO 类都可以用作 Struts 2 的Action 。 线程模式方面的对比:Struts 1 Action 是单例模式并且必须是线程安全的,因为仅有Action 的一个实例来处理所有的请求。单例策略限制了Struts 1 Action 能做的事,并且要在开发时特别小心。Action 资源必须是线程安全的或同步的;Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。 Servlet 依赖方面的对比:Struts 1 Action 依赖于 Servlet API,因为Struts 1 Action 的execute 方法中有HttpServletRequest 和HttpServletResponse 方法。Struts 2 Action 不再依赖于 Servlet API,从而允许Action 脱离Web 容器运行,从而降低了测试Action 的难度。当然,如果Action 需要直接访问HttpServletRequest 和HttpServletResponse 参数,Struts 2 Action 仍然可以访问它们。但是,大部分时候,Action 都无需直接访问HttpServetRequest 和HttpServletResponse,从而给开发者更多灵活的选择。 可测性方面的对比:测试Struts 1 Action 的一个主要问题是execute 方法依赖于Servlet API,这使得Action 的测试要依赖于Web 容器。为了脱离Web 容器测试 Struts1

搞清多表之间的关系

多表之间的关系操作总结 经典例子: 一对一:身份证号码与人 一对多:城市与大学,订单与订单项,部门与员工,班级与学生等等。 多对一:一对多的反面。订单项与订单,大学与城市,员工与公司,学生与班级。多对多:学生与老师 一对多:单向、双向。 一对多关系中单向与双向的区别: 单向体现在程序中就是你可以通过一方得到另一方,但不能通过另一方得到这一方双向就是彼此都能得到对方,相互都有关于对方的一个引用。(外键) 什么时候需要用单向,什么时候需要用双向。 网友答: 只需要从一方获取另一方的数据时就使用单向关联 双方都需要获取对方数据时就使用双向关系 部门---人员 使用人员时 如果只需要获取对应部门信息(user.getDeptarment()) 不需要从部门下的人员信息时,就配置成单向多对一 使用部门时 如果只需要获取部门下人员信息(deptartmanet.getUsers()) 不需要从人员获取部门信息时,就配置成单向一对多 既要获取部门下人员 deptartmanet.getUsers() 又要从人员获取部门信息 user.getDeptarment() 那就配置成双向一对多,也就是双向多一

看需求来配置了。 单向多对一”、“单向一对多,其实概念一样,记得在多的一端配置 双向一对多就是两边都要配,做到你中有我我中有你 弄清楚:关系维护端和关系被维护端。 1—m:多的一方是关系维护端,关系维护端负责外键记录的更新,关系被维护端没有权利更新外键字段。 不管是一对多,还是多对一,外键一定建在多的那方。外键一定是另一张表中已经存在的主键。 关于@mappedBy和@JoinColumn 表示声明一对多关系由对方维护,自己将不再维护,就算在自己这端设置值,保存到数据库后外键依然是null @mappedBy注解的作用:在JPA中,在@OneToMany里加入mappedBy属性可以避免生成一张中间表。 网上: a)只有OneT oOne,OneT oMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性; b)mappedBy标签一定是定义在the owned side(被拥有方,也叫关系被维护端,即一的一方),他指向theowning side(拥有方,也叫关系维护端,即多的一方); c)关系的拥有方负责关系的维护,在拥有方建立外键。所以用到@JoinColumn d)mappedBy跟JoinColumn/JoinTable总是处于互斥的一方,可以理解为正是由于拥有方的关联被拥有方的字段存在,拥有方才拥有了被拥有方。mappedBy这方定义JoinColumn/JoinT able总是失效的,不会建立对应的字段或者表。 @JoinColumn所在实体是关系拥有方,name的值即拥有方对应表到参考表的外键名称。@ mappedBy所在实体是关系的被拥有方,value值owner中表示被拥有类的属性。 举例子:创建两个实体类 一对多时,建立实体类时:一的一方需要一个Set或者List集合存储多的对象,多的一方需要定义一个一的对象。需要设置外键的一方需要加上@JoinColoumn注解。 例子: 城市与大学:一对多

用MyEclipse如何自动生成hibernate的.hbm.xml文件

用MyEclipse如何自动生成hibernate的.hbm.xml文件(2010-07-29 17:36:01) 今天在网上看到很多人都不知道怎么用MyEclipse自动生成hibernate的.hbm.xml文件。我甚至看到有位兄弟竟然自己写出那个格式的文件来。首先我不得不佩服那位兄弟的记忆力。可是我这边有更直接的方法希望能对那些入门级别的人一点帮助! 在hibernate中,每个数据表对应的其实是一个实体类,每个实体类有一个对应的hbm.xml 配置文件和你匹配,myeclipse中其实有个MyEclipse Database Explorer视图,它提供了myeclipse与数据库直接连接的内置窗口,并且通过此窗口可以生成hibernate的mapping文件。 1.在项目上点击右键选择MyEclipse选项,为应用增加Hibernate特性. 2.在出现的配置窗口中,选中“Add Hibernate 2.1 libraries to project?”,然后设定存放Hibernate 库文件的目录为:/WEB-INF/lib 目录,默认会选择创建一个新的Hibernate配置文件hibernate.cfg.xml。 3.点击下一步,进入Hibernate数据库连接配置界面,在Connection Profile选项中直接选择在MyEclipse Database Explorer中配置的vipdata选项,然后就会自动生成其他的配置,可以选择“Copy JDBC Driver and add to classpath”,这样就会将JDBC驱动拷贝到WEB-INF/lib目录中。: 4.点击下一步,来创建Hibernate的SessionFactory类,这是一个简单的集中管理Hibernate 会话的工厂类,填写类的全名称。 5.点击完成,然后MyEclipse就会将Hibernate相关的jar包拷贝到lib目录下,同时会生成Hibernate的配置文件:hibernate.cfg.xml,和SessionFactory类。 现在要利用MyEclipse Database Explorer视图中的工具来生成Hibernate的映射文件。切换到MyEclipse Database Explorer视图,在表vipdata上点击右键,选择Create Hibernate Mapping.

Hibernate(V)——一对多与多对多关联关系映射(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"),而一方(教室类)无需做任何多方的定义。 注意;多方必须保留一个不带参数的构造器! import ; import ; import ; //班级类,在多对一关系中属于一的方,不持有其他多余的配置,反而是被多方持有

如何根据hibernate的实体类和实体类配置文件生成数据库的表

网络地址: 主题:如何根据hibernate的实体类和实体类配置文件生成数据库的表 内容部分 [c-sharp]view plaincopyprint? 1. 4. 5. 6. jdbc:mysql://12 7.0.0.1/lianxi 7. com.mysql.jdbc.Driver 8. root 9. root 10. org.hibernate.dialect.MySQLDialect 11. true 12. update 13. 14. 15. 16. 17. 18. 19.

HQL 查询

Hibernate提供了强大的查询系统,使用Hibernate有多种查询方法可以选择:可以使用Hibernate的HQL查询,也可以使用条件查询,甚至可以使用原生的SQL 查询语句。其中HQL查询时Hibernate配置的功能强大的查询语句。HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态和关联之类的概念。 一、HQL查询 HQL的语法和SQL很相似,但是HQL是一种面向对象的查询语句,它的操作对象是类、实例、属性等,而SQL的操作对象是数据表、列等数据库对象。 由于HQL是完全面向对象的查询语句,因此可以支持继承、多态等特性。 HQL查询依赖于Query类,每一个Query实例对应一个查询对象,它的执行是通过Session的createQuery()方法来获得的。 执行HQL查询的步骤: 1、获得Hibernate Session对象 2、编写HQL语句 3、调用Session的createQuery方法创建查询对象 4、如果HQL语句包含参数,则调用Query的setXxx方法为参数赋值 5、调用Query对象的list等方法返回查询结果。 实例: 上面的程序先编写HQL语句后,使用Session的createQuery(hql)方法创建一个Query,Query对象使用setXxx方法为HQL语句的参数赋值,最后调用list()方法返回查询的全部结果。 在这里Query对象可以连续多次调用setXxx方法为HQL参数赋值。这是因为Hibernate Query的setXxx方法的返回值为Query本身,因此程序创建Query后,可以直接多次调用setXxx方法为HQL语句的参数赋值。

hibernate关系映射注解配置

1. Hibernate Annotation关系映射有下面几种类型: 1)一对一外键关联映射(单向) 2)一对一外键关联映射(双向) 3)一对一主键关联映射(不重要,有需要看下文档即可) 在实际中很少用,使用注解@PrimaryKeyJoinColumn 意思是说,我的主键去参考另外一张表中的主键,作为我的主键,但是在我测试使用 注解一对一主键关联映射,在生成表的时候,数据库中并没有生成关联,使用XML 映射可以生成。Annotation注解一对一主键关联映,有些bug。不过没空去研究它。 因为在实际开发中一对一很少用。在实际开发中我机会没有用过,主键关联就更少了 4)多对一关联映射(单向) 5)一对多关联映射(单向) 6)一对多关联映射(双向) 7)多对多关联映射(单向) 8)多对多关联映射(双向) 2.介绍各种映射用法 1)一对一外键关联映射(单向)Husband ---> Wife public class Husband{ private Wife wife; @OneToOne(cascade=CascadeType.ALL) @JoinColumn(name="wife_id",unique=true) public Wife getWife(){…} … } public class Wife{ } 一对一外键关联,使用@OneToOne,并设置了级联操作 @JoinColum设置了外键的名称为wife_id(数据库字段名),如果不设置,则默认为另一类的属性名+ _id 外键的值是唯一的(unique),不可重复,与另一类的主键一致 2)一对一外键关联映射(双向)Husband <---> Wife public class Husband{ private Wife wife; @OneToOne(cascade=CascadeType.ALL) @JoinColumn(name="wife_id",unique=true) public Wife getWife(){…} ... } public class Wife{ private Husband husband; @OneToOne(mappedBy="wife",cascade=CascadeType.ALL) public Husband getHusband(){…} ... } 一对一双向关联关系,使用@OneToOne 注意:需要加上mappedBy="wife",如果不加上的话,Wife也会生成一个外键(husband_id)。mappedby="wife"需要指向与他关联对象的一个属性(即Husband类里面的wife属性),这里的会在Husband表里面生成个外键wife_id字段,而Wife表里则不会生成。这里Husband作为维护端即主

一对多的自身关联

一对多的自身关联 一的一方和多的一方都属于同一个类 这种结构就类似于树状结构 每一个对象内部本身包括 一个父节点对象(此时这个原本的对象对于这个父节点对象是多对一的关系) 一个子节点的集合(此时这个对象对于子节点集合来说又是一对多的关系) 创建表 create table creature( id bigint primary key, name varchar(15), parent_creature_id bigint ); 一对一关联第一种关联方式通过一个表的主键由另一个表来产生 第一张表 create table husband( id varchar(100) primary key,

name varchar(100) default '' )character set utf8 collate utf8_general_ci;---能插入中文字符 create table wife( id varchar(100) primary key, name varchar(100) default '' )character set utf8 collate utf8_general_ci; Husband.hbm中uuid方式产生主键 在wife hbm中

Java应用数据库:Hibernate对多表关联查询

执行救济竞合的实务把握 周玉和彭长林所谓执行救济竞合,是指执行当事人、利害关系人或案外人,就具体执行案件的同一执行行为或执行标的,各自以不同的途径、方式及理由等提出异议,交由人民法院审查裁决的情形。慧眼辨析和准确把握执行救济竞合,对于及时、准确审查处理执行争议,提高执行效率,保护执行当事人、利害关系人、案外人合法权益具有积极意义。笔者现侧重从实务的角度,针对执行救济不同路径的竞合情形,就如何在实务中把握谈些心得。 执行实践中执行救济竞合情形,常见的有各不同主体的执行异议救济竞合、利害关系人程序异议与案外人实体异议竞合、消极执行与执行异议及执行监督救济竞合、执行异议与案外人异议及执行监督救济竞合四种情形。对执行救济竞合情形的不同处理,将在后续救济途径、救济时效、救济功能上产生不同的法律后果。因此,在司法实务中应当明晰梳辨、认真把握,针对不同情形作出不同处理。具体可从四个方面审查把关: 一、把好立案受理关 原则上对所有执行当事人、利害关系人、案外人的异议、执行复议、案外人异议之诉等,均应予以受理。但对同一主体就同一执行事项所提出的异议,则只能选择其中最恰当情形予以立案;如果当事人、利害关系人、案外人已行使异议权、复议权、申请更换执行法院权、诉权以资救济,则无必要启动执行监督立案程序。反之,则应当启动执行监督立案程序予以执行监督。 对于立案受理这一环节,还应注意:一是审查基本要件,防止恶意异议。基本要件包括异议主体身份资料,如公民个人的居民身份证或户口簿、法人的机构代码证等;异议书使用书面形式提出,并由异议人签名盖章;相应的基本证据材料,如执行法院的具体执行行为法律文

书、执行行为所违反的法律条文、对执行标的权属凭证或相应权利证明等。三个基本情况不能同时提供的,一般不予立案受理。二是审查提起异议、复议或诉讼期间。对执行异议要求在执行程序结束前提出;对执行程序已经结束的,不能再作执行异议立案。对所遭受的损害,异议人可通过提起损害赔偿之诉或返还不当得利之诉或者要求执行法院予以国家赔偿;对申请变更执行法院,只能向上一级法院提出,但需适度控制,一般限于被执行人有财产可供执行或有条件执行的案件,且需执行期间满六个月以上(这里的六个月应当剔除公告期间、鉴定评估、异议审查等期间;对裁定不服向上一级法院申请复议期间为十日内,执行当事人、案外人向执行法院提起的许可执行之诉、执行标的异议之诉、分配方案异议之诉,为收到裁定或通知之日起十五日内。 二、把好审查定性关 首先,对执行异议及复议,主要审查执行行为是否违反了法律规定和司法解释,即审查执行行为的合法性。执行行为的范围主要包括四个方面:执行法院采取的执行措施、强制执行时应当遵守的程序、强制执行中作出的某些法律文书(包括应发出而未发出相应的法律文书,应发出但发出了错误的法律文书,不应发出而发出了某种法律文书等等,如进行民事搜查时未出示搜查令等、其他侵害当事人、利害关系人合法权益的执行行为(如违法追加、变更被执行人等。上述情形往往相互交织在一起,难以截然分开。 还应当明确,对于新民事诉讼法所规定的对被执行人限制出境、在征信系统记录、在媒体公布不履行义务信息,应当作为一种执行行为对待,对其异议应按执行异议、复议程序审查。 其次,对案外人异议,主要审查案外人对执行标的物有无“所有权或者是其他阻止标的物转让、交付的权利”,即是否有足以排除强制执行的权利。这种权利不一定都是物权,主要包括所有权、用益物权、担保物权、占有、孳息收取权、债权、依法保全的标的物等。

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

利用轻量对象关系映射技术Hibernate提高开发效率 Enhancing Development Efficiency with Hibernate a Lightweight Object/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 Permanence 0 引言 随着internet的发展,应用服务程序已经从集中式、C/S模式过渡到B/S、分布式模式;无论是用户或是供应商都迫切希望缩短开发周期、提高开发效率,Hibernate应运而生。 1 Hibernate简介 Hibernate是一个面向Java环境的对象/关系数据库映射工具。对象/关系数据库映射(Object/Relational Mapping , ORM)这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型中去。 Hibernate不仅提高Java类到数据库的映射,还提供数据查询和获取数据的方法。Hibernate在英语中的意思是“冬眠”,顾名思义它使得商务逻辑的开发和数据库最大程度地分离,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。Hibernate的目标是解放开发者通常与数据持久化相关的编程任务的95%。对于那些在基于Java的中间层应用中,它们实现面向对象的业务模型和商业逻辑的应用,Hibernate是很有用的。 图1是Hibernate的体系结构图,从图中可以Array看到,系统为3层B/S模式,应用程序在客户端运 行将持久化的对象交由Hibernate。Hibernate通过 properties属性设置和XML Mapping实现商务逻 辑,调用和存储低层数据库后将返回的结果送给 客户端。 Hibernate对每一种数据库都有对应的 Dialect进行操作优化,从而提高它在各种情况 下的效率。目前,它的版本为3.0、支持的数据 库有Oracle、DB2、MySQL、PostgreSQL、Sybase,Interbase、Pointbase、Microsoft SQL Server、

相关文档
最新文档