文档库 最新最全的文档下载
当前位置:文档库 › Hibernate各种主键生成策略与配置详解

Hibernate各种主键生成策略与配置详解

Hibernate各种主键生成策略与配置详解
Hibernate各种主键生成策略与配置详解

1、assigned

主键由外部程序负责生成,在save()之前必须指定一个。Hibernate不负责维护主键生成。与Hibernate和底层数据库都无关,可以跨数据库。在存储对象前,必须要使用主键的setter方法给主键赋值,至于这个值怎么生成,完全由自己决定,这种方法应该尽量避免。

注释方式

@Id

@GeneratedValue(generator ="ud")

@GenericGenerator(name ="ud", strategy ="assigned")

“ud”是自定义的策略名,人为起的名字,后面均用“ud”表示。

特点:可以跨数据库,人为控制主键生成,应尽量避免。

2、increment

由Hibernate从数据库中取出主键的最大值(每个session只取1次),以该值为基础,每次增量为1,在内存中生成主键,不依赖于底层的数据库,因此可以跨数据库。

Hibernate调用org.hibernate.id.IncrementGenerator类里面的generate()方法,使用select max(idColumnName) from tableName语句获取主键最大值。该方法被声明成了synchronized,所以在一个独立的Java虚拟机内部是没有问题的,然而,在多个JVM同时并发访问数据库select max时就可能取出相同的值,再insert就会发生Dumplicate entry的错误。所以只能有一个Hibernate应用进程访问数据库,否则就可能产生主键冲突,所以不适合多进程并发更新数据库,适合单一进程访问数据库,不能用于群集环境。

官方文档:只有在没有其他进程往同一张表中插入数据时才能使用,在集群下不要使用。

注释方式

@Id

@GeneratedValue(generator ="ud")

@GenericGenerator(name ="ud", strategy ="increment")

特点:跨数据库,不适合多进程并发更新数据库,适合单一进程访问数据库,不能用于群集环境。

3、hilo

hilo(高低位方式high low)是hibernate中最常用的一种生成方式,需要一张额外的表保存hi的值。保存hi值的表至少有一条记录(只与第一条记录有关),否则会出现错误。可以跨数据库。

hibernate_hilo

next_hi

100

hibernate_hilo 指定保存hi值的表名

next_hi 指定保存hi值的列名

100 指定低位的最大值

也可以省略table和column配置,其默认的表为hibernate_unique_key,列为next_hi

100

hilo生成器生成主键的过程(以hibernate_unique_key表,next_hi列为例):

1.获得hi值:读取并记录数据库的hibernate_unique_key表中next_hi字段的值,数据库中此字段值加1保存。

2.获得lo值:从0到max_lo循环取值,差值为1,当值为max_lo值时,重新获取hi 值,然后lo值继续从0到max_lo循环。

3.根据公式hi * (max_lo + 1) + lo计算生成主键值。

注意:当hi值是0的时候,那么第一个值不是0*(max_lo+1)+0=0,而是lo跳过0从1开始,直接是1、2、3……

那max_lo配置多大合适呢?

这要根据具体情况而定,如果系统一般不重启,而且需要用此表建立大量的主键,可以吧max_lo配置大一点,这样可以减少读取数据表的次数,提高效率;反之,如果服务器经常重启,可以吧max_lo配置小一点,可以避免每次重启主键之间的间隔太大,造成主键值主键不连贯。

注释方式

@Id

@GeneratedValue(generator ="ud")

@GenericGenerator(name ="ud", strategy ="hilo", parameters = { @Parameter(name ="table", value ="hibernate_hilo"),

@Parameter(name ="column", value ="next_hi"),

@Parameter(name ="max_lo", value ="100")})

特点:跨数据库,hilo算法生成的标志只能在一个数据库中保证唯一。

4、seqhilo

与hilo类似,通过hi/lo算法实现的主键生成机制,只是将hilo中的数据表换成了序列sequence,需要数据库中先创建sequence,适用于支持sequence的数据库,如oracle。

hibernate_seq

100

注释方式

@Id

@GeneratedValue(generator ="ud")

@GenericGenerator(name ="ud", strategy ="seqhilo", parameters = { @Parameter(name ="sequence", value ="hibernate_hilo"),

@Parameter(name ="max_lo", value ="100") })

特点:与hilo类似,只能在支持序列的数据库中使用。

5、sequence

采用数据库提供的sequence机制生成主键,需要数据库支持sequence。如oralce、DB、SAP DB、PostgerSQL、McKoi中的sequence。MySQL这种不支持sequence的数据库则不行(可以使用identity)。

hibernate_id

hibernate_id指定sequence的名称Hibernate生成主键时,查找sequence并赋给主键值,主键值由数据库生成,Hibernate不负责维护,使用时必须先创建一个sequence,如果不指定sequence名称,则使用Hibernate默认的sequence,名称为hibernate_sequence,前提要在数据库中创建该sequence。

注释方式

@Id

@GeneratedValue(generator ="ud")

@GenericGenerator(name ="ud", strategy ="sequence",

parameters = {@Parameter(name ="sequence",

value ="hibernate_seq") })

特点:只能在支持序列的数据库中使用,如Oracle。

6、identity

identity由底层数据库生成标识符。identity是由数据库自己生成的,但这个主键必须设置为自增长,使用identity的前提条件是底层数据库支持自动增长字段类型,如DB2、SQL Server、MySQL、Sybase和HypersonicSQL等,Oracle这类没有自增字段的则不支持。

例:如果使用MySQL数据库,则主键字段必须设置成auto_increment。

id int(11) primary key auto_increment

注释方式

@Id

@GeneratedValue(generator ="ud")

@GenericGenerator(name ="ud", strategy ="identity")

特点:只能用在支持自动增长的字段数据库中使用,如MySQL。

7、native

native由hibernate根据使用的数据库自行判断采用identity、hilo、sequence 其中一种作为主键生成方式,灵活性很强。如果能支持identity则使用identity,如果支持sequence则使用sequence。

例如MySQL使用identity,Oracle使用sequence

注意:如果Hibernate自动选择sequence或者hilo,则所有的表的主键都会从Hibernate默认的sequence或hilo表中取。并且,有的数据库对于默认情况主键生成测试的支持,效率并不是很高。

使用sequence或hilo时,可以加入参数,指定sequence名称或hi值表名称等,如hibernate_id

注释方式

@Id

@GeneratedValue(generator ="ud")

@GenericGenerator(name ="ud", strategy ="native")

特点:根据数据库自动选择,项目中如果用到多个数据库时,可以使用这种方式,使用时需要设置表的自增字段或建立序列,建立表等。

8、uuid

UUID:Universally Unique Identifier,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字,标准的UUID格式为:

xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)其中每个x是0-9或a-f范围内的一个十六进制的数字。

Hibernate在保存对象时,生成一个UUID字符串作为主键,保证了唯一性,但其并无任何业务逻辑意义,只能作为主键,唯一缺点长度较大,32位(Hibernate将UUID中间的“-”删除了)的字符串,占用存储空间大,但是有两个很重要的优点,Hibernate在维护主键时,不用去数据库查询,从而提高效率,而且它是跨数据库的,以后切换数据库极其方便。

注释方式

@Id

@GeneratedValue(generator ="ud")

@GenericGenerator(name ="ud", strategy ="uuid")

特点:uuid长度大,占用空间大,跨数据库,不用访问数据库就生成主键值,所以效率高且能保证唯一性,移植非常方便,推荐使用。

9、guid

GUID:Globally Unique Identifier全球唯一标识符,也称作UUID,是一个128位长的数字,用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成GUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复。

Hibernate在维护主键时,先查询数据库,获得一个uuid字符串,该字符串就是主键值,该值唯一,缺点长度较大,支持数据库有限,优点同uuid,跨数据库,但是仍然需要访问数据库。

注意:长度因数据库不同而不同

MySQL中使用select uuid()语句获得的为36位(包含标准格式的“-”)

Oracle中,使用select rawtohex(sys_guid()) from dual语句获得的为32位(不包含“-”)

注释方式

@Id

@GeneratedValue(generator ="ud")

@GenericGenerator(name ="ud", strategy ="guid")

特点:需要数据库支持查询uuid,生成时需要查询数据库,效率没有uuid高,推荐使用uuid。

10、foreign

使用另外一个相关联的对象的主键作为该对象主键。主要用于一对一关系中。

user

该例使用https://www.wendangku.net/doc/e514840545.html,er的主键作为本类映射的主键。

注释方式

@Id

@GeneratedValue(generator ="ud")

@GenericGenerator(name ="ud", strategy ="foreign",

parameters = {@Parameter(name ="property", value ="user") })

@OneToOne

@PrimaryKeyJoinColumn

特点:很少使用,大多用在一对一关系中。

11、select

使用触发器生成主键,主要用于早期的数据库主键生成机制,能用到的地方非常少。12、其他注释方式配置

注释方式与配置文件底层实现方式相同,只是配置的方式换成了注释方式

自动增长,适用于支持自增字段的数据库

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

根据底层数据库自动选择方式,需要底层数据库的设置

如MySQL,会使用自增字段,需要将主键设置成auto_increment。

@Id

@GeneratedValue(strategy = GenerationType.AUTO)

使用表存储生成的主键,可以跨数据库。

每次需要主键值时,查询名为"hibernate_table"的表,查找主键列"gen_pk"值为"2"记录,得到这条记录的"gen_val"值,根据这个值,和allocationSize的值生成主键值。

@Id

@GeneratedValue(strategy = GenerationType.TABLE, generator ="ud") @TableGenerator(name ="ud",

table ="hibernate_table",

pkColumnName ="gen_pk",

pkColumnValue ="2",

valueColumnName ="gen_val",

initialValue = 2,

allocationSize = 5)

使用序列存储主键值

@Id

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator ="ud")

@SequenceGenerator(name ="ud",

sequenceName ="hibernate_seq",

allocationSize = 1,

initialValue = 2)

13、小结

1、为了保证对象标识符的唯一性与不可变性,应该让Hibernate来为主键赋值,而不是程序。

2、正常使用Hibernate维护主键,最好将主键的setter方法设置成private,从而避免人为或程序修改主键,而使用assigned方式,就不能用private,否则无法给主键赋值。

2、Hibernate中唯一一种最简单通用的主键生成器就是uuid。虽然是个32位难读的长字符串,但是它没有跨数据库的问题,将来切换数据库极其简单方便,推荐使用!

3、自动增长字段类型与序列

数据库自动增长字段序列

MySQL是

Oracle是

DB2是是

MS SQL Server是

Sybase是

HypersonicSQL是

PostgreSQL是

SAP DB是

HSQLDB是

Infomix是

4、关于hilo机制注意:

hilo算法生成的标志只能在一个数据库中保证唯一。

当用户为Hibernate自行提供连接,或者Hibernate通过JTA,从应用服务器的数据源获取数据库连接时,无法使用hilo,因为这不能保证hilo单独在新的数据库连接的事务中访问hi值表,这种情况,如果数据库支持序列,可以使用seqhilo。

5、使用identity、native、GenerationType.AUTO等方式生成主键时,只要用到自增字段,数据库表的字段必须设置成自动增加的,否则出错。

6、还有一些方法未列出来,例如uuid.hex,sequence-identity等,这些方法不是很常用,且已被其他方法代替,如uuid.hex,官方文档里建议不使用,而直接使用uuid方法。

7、Hibernate的各版本主键生成策略配置有略微差别,但实现基本相同。如,有的版本默认sequence不指定序列名,则使用名为hibernate_sequence的序列,有的版本则必须指定序列名。

8、还可以自定义主键生成策略,这里暂时不讨论,只讨论官方自带生成策略。

Hibernate主键生成策略

Hibernate主键生成策略 本文介绍几种常见的主键生成策略,先通过xml文件配置这种方式来介绍主键生成策略,配置主键生成方式的方法如下配置文件: 1.Assigned 该主键生成方式是在保存一条数据的时候需要人为的通过程序为主键指定值,如果不指定主键值在第一次执行保存的时候,数据也能过插入到数据库并且程序也不会出现运行错误,但是表中该条数据的主键是0,当再次执行保存的时候,程序就会出现运行错误,具体错误如下:

虽然hibernate会执行一条插入的sql语句但是程序报错执行数据回滚,因此没有插入到数据表中。 因此,在使用assigned方式来生成主键的时候,程序中必须为主键指定值。 2.Increment 这种生成方式是主键依次增加1,在每次执行插入保存数据的时候,hibernate会先查询表中主键的最大值然后加1作为本次插入数据的主键值,我们可以通过程序运行控制台打印的sql语句就可以看出,每次执行插入方法的时候hibernate会执行两条sql语句,如下:

注意用该种生成策略的时候必须将主键的类型设定为long或者int的整数类型。 3.Identity 该种方法采用自动增长的策略生成主键,生成唯一标识。Hibernate 执行一条sql语句,如下: 但是需要注意的是该种生成策略需要依赖于底层数据库的特种,只能使用有主键自动增长功能的数据库,如mysql,在设计数据库主键的时候其类型也必须是long或者int的整数类型;使用oracle 数据库的时候该种策略就行不通,因为oracle是不支持主键自动增长的。 4.Sequence 该种方法采用序列的策略生成主键,这种方式也需要依赖于底层数据库,只适用于能生成序列的数据库,如oracle;在oracle中生成sequence的语句为: create sequence seq_name increment by 1 start with 1; 每次插入数据的时候指定主键的值为seq_name.nextval(); 如果不指定自己创建的序列,hibernate会给我们提供一个默认的序列,是hibernate_sequence,也需要在数据库中创建这个序列。

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.域对象间的关系 关联: 类间的引用关系。以属性定义的方式表现。

中文版hibernate-annotations-3.4.0.CR1-doc

Hibernate Annotations 参考文档 3.2.0 CR1 目录 前言 1. 翻译说明 2. 版权声明 前言 1. 创建一个注解项目 1.1. 系统需求 1.2. 系统配置 2. 实体Bean 2.1. 简介 2.2. 用EJB3注解进行映射 2.2.1. 声明实体bean 2.2.1.1. 定义表(Table) 2.2.1.2. 乐观锁定版本控制 2.2.2. 映射简单属性 2.2.2.1. 声明基本的属性映射 2.2.2.2. 声明列属性 2.2.2. 3. 嵌入式对象(又名组件) 2.2.2.4. 无注解之属性的默认值 2.2.. 映射主键属性 2.2.4. 映射继承关系 2.2.4.1. 每个类一张表 2.2.4.2. 每个类层次结构一张表 2.2.4. 3. 连接的子类 2.2.4.4. 从父类继承的属性 2.2.5. 映射实体Bean的关联关系 2.2.5.1. 一对一(One-to-one) 2.2.5.2. 多对一(Many-to-one) 2.2.5. 3. 集合类型 2.2.5.4. 用cascading实现传播性持久化(Transitive persistence) 2.2.5.5. 关联关系获取 2.2.6. 映射复合主键与外键 2.2.7. 映射二级表(secondary tables) 2.3. 映射查询 2.3.1. 映射EJBQL/HQL查询 2.3.2. 映射本地化查询 2.4. Hibernate独有的注解扩展 2.4.1. 实体 2.4.2. 标识符 2.4. 3. 属性

2.4. 3.1. 访问类型 2.4. 3.2. 公式 2.4. 3.3. 类型 2.4. 3. 4. 索引 2.4. 3.5. @Parent 2.4. 3.6. 生成的属性 2.4.4. 继承 2.4.5. 关于单个关联关系的注解 2.4.5.1. 延迟选项和获取模式 2.4.6. 关于集合类型的注解 2.4.6.1. 参数注解 2.4.6.2. 更多的集合类型 2.4.7. 缓存 2.4.8. 过滤器 2.4.9. 查询 3. 通过XML覆写元数据 3.1. 原则 3.1.1. 全局级别的元数据 3.1.2. 实体级别的元数据 3.1.3. 属性级别的元数据 3.1. 4. 关联级别的元数据 4. Hibernate验证器 4.1. 约束 4.1.1. 什么是约束? 4.1.2. 内建约束 4.1.3. 错误信息 4.1.4. 编写你自己的约束 4.1. 5. 注解你的领域模型 4.2. 使用验证器框架 4.2.1. 数据库schema层次验证 4.2.2. Hibernate基于事件的验证 4.2.3. 程序级验证 4.2.4. 验证信息 5. Hibernate与Lucene集成 5.1. 使用Lucene为实体建立索引 5.1.1. 注解领域模型 5.1.2. 启用自动索引 A. 术语表 前言 WARNING! This is a translated version of the English Hibernate reference documentation. The translated version might not be up to date! However, the differences should only be very minor. Consult the English reference documentation if you are missing information or encounter a translation error. If you like to contribute to a particular translation, contact us on the Hibernate developer mailing list. Translator(s): RedSaga Translate Team 满江红翻译团队 1. 翻译说明

以生成性策略为主

以生成性策略为主,替代性策略为辅的教学 设计案例——设计定位的学习 阳谷县第一中学雷彬 2010年7月21日12:24 曹爱霞于10-7-21 13:41推荐雷老师的教学功底深厚,明确了老师和学生的定位,确实,只有老师发挥好自己的主导作用,学生的主体性才能体现。 教学策略的分类依据不同的角度和标准就会有不同的分类,其中一种是根据信息加工的控制点不同,将教学策略分成的两大类,即替代性策略和生成性策略。所谓替代性策略在学习过程中,教师代替学生处理信息,为学生提供学习目标、选择教学内容、安排教学顺序以及设计教学活动等。而生成性策略是指让学生作为学习的主要控制者,学生自己形成学习目标,自己对学习内容进行组织加工、安排学习活动的顺序、并鼓励学生自己从教学中建构具有个人特有风格的学习。教师在此作为学习的指导者和帮助者,为学生提供一些必要的教学支持。学生主要依靠自己的力量,通过探究活动进行学习。 有效的教学策略可以提高师生的教学效率,教学策略具有指示性和灵活性,不同的教学目标需要使用不同的教学策略。对于教学来说,没有任何单一的策略能够适用于所有的情况,需要依据具体的教学实际制定教学策略。 (1)从教学目标出发 (2)根据学习理论和教学理论 (3)要符合学习内容的客观要求

(4)要适合教学对象的特点 (5)考虑教师本身的素养条件 (6)要考虑教学条件的可能性 本篇教学设计案例按照两者结合,以一主一辅的方式进行。以“设计定位”为例,设计教学设计。 一、教学目标 1.认识设计定位的作用。 2.理解设计定位的实质。 3.会采用调查、统计等方法征集对设计的建议。 4.能对自己的设计课题进行合理的定位。 二、教材分析 本节课的内容是在上节课提出了设计课题的基础上,继续学习设计定位。教材以“多功能文具盒”为载体,讲解设计定位相关的知识和操作方法、思考方法。理解相对简单,但是需要同学们结合自己的设计课题进行应用,要有清晰和周密的思路。因此,理解理论知识简单,但是进行设计定位的难点。

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_测试题

medal.setType("Gold Medal"); session.save(user); session.close(); } A.配置文件配置有误 B.没有在配置文件中包含对映射文件的声明 C.映射文件配置有误 D.没有开启事务 5.下列属于多对一关系的是(bd )。(选两项) A.书和作者 B.手机和生产厂家 C.用户和发布的出租信息 D.士兵和班长 6.下面是某系统中的两个实体类,依此可以得知(b )。 public class Wage{ //月工资实体类 private Long wid; private String empName; //雇员姓名 private String month; //月份 //Getter & Setter …… } public class WageItem{ //工资项 private Wage wage; private Long iid; private String itemName; //项目名称,如基本工资、职位津贴等private String amount; //数额 //Getter & Setter …… } A.Wage 和WageItem 间存在单向一对多的关联 B.Wage 和WageItem 间存在单向多对一的关联 C.Wage 和WageItem间存在双向一对多的关联 D.Wage 和WageItem间存在双向多对一的关联 7.两实体类代码如下: public class Wage{ //月工资实体类 private Long wid; private String empName; //雇员姓名 private String month; //月份 //Getter & Setter …… } public class WageItem{ //工资项 private Wage wage;

spring4.x + hibernate4.x 配置详解

spring4.x + hibernate4.x 配置详解 关于spring和hibernate的使用以及特征等等,在此不再啰嗦,相信大家也都知道,或者去搜索一下即可。 本篇博文的内容主要是我最近整理的关于spring4.x 和hibernate 4.x 相关配置和使用方式,当然spring3.x以及hibernate4.x也可以借鉴。 首先是配置文件web.xml 增加以下代码即可 contextConfigLocation classpath*:/applicationContext.xml org.springframework.web.context.ContextLoaderListener 然后建立 applicationContext.xml 文件,src下。文件内容如下,注释我尽量写的很详细

科学课堂生成性教学的策略

科学课堂生成性教学的策略 《科学新课程标准》倡导的就是生成性教学:即在弹性预设的前提下,在教学展开过程中由教师和学生根据不同的教学情境,自主构建教学活动的过程。主动把教师的心灵与学生的心灵相融,珍视学生变化的学习需要,精心“预设”与即时“生成”相统一的弹性调控过程,及时形成反思元教学。那么,以探究为主的科学生成性课堂一定会生机盎然,充满生命的气息与情趣。 新一轮课程改革的实施为课堂教学注入了新的活力和生机。但在教学过程中仍存在着一些弊端,集中表现在教师只重视研究教的内容的组织,而忽视从学的角度去思考学习内容的呈现方式,尤其忽视学习过程中生成性资源的开发和利用。新课程改革提出“把课堂还给学生,让课堂充满生命气息”,要求教师不仅在课堂上努力为每个学生的主动参与提供广泛的可能性,更应关注学生在课堂活动中的状态,在变动不已的课堂中发现、判断、整合学习活动中反馈出来的课程资源,并充分开发和利用这些生成资源,实现课堂教学的多姿多彩。 一、问题的提出 一次,本人承担了一节校内公开课:八年级下册第二章第2节《氧气与氧化》,我根据新课程理念设计了教学预设。有游戏导入,有合作讨论,有分组实验,有自主探究,还不时地渗透情感教育。在学生分组实验时,我亲切巡视和俯身倾听。总之整堂课气氛热烈,高潮迭起。在这样一个圆满的结局即将产生时,一个学生突然提了一个问题:燃烧是否一定需要氧气参与?当时,我的第一个反应就是:要解决这个问题,就要拖课。因为从严格的意义上讲,燃烧不一定要氧气参与,如何让学生信服,不是一时半会就能证明。今天是公开课,一拖堂,就不完美了。而且,这个问题也不在我预设之中。于是,我故作亲切地说:感谢这位同学的提问,同时你也给我们布置了一个课后任务。那么,就请大家课后自由组合去思考、去探究,下节课汇报。同时,我心里暗喜——本人多么有“教学机智”啊!此后,因各种原因都没在课上交流,只在练习中提过一次。 现在回想起来,整堂课无非就是为了成功完成自己预先设定的教学任务,达到预定目标,牵引着学生按照我预设的教学流程一步一步走向下课。比如:在学生分组实验时,我的确不时地亲切巡视和俯身倾听。其实,我更偏向关心哪组学生能顺利完成实验,能在演示和总结的时候起到一个表率作用,让课堂充满成功的气息。此外,学生在这课堂上的真实感受和想法也几乎没有得到我的关注。殊不知,学生产生的问题在科学课上是很宝贵的,它比任何教材例子都真实。学生提出的好问题就应该研究、解决,而且要及时。 在传统科学课堂教学中,过分强调预设与控制的弊端有:学生习惯以师为本,教师刻意执行预设教案,冷落课堂生成,课堂讲求结构严谨、层次分明的教学方式。学生尤如“被缝翅的鸽子”,难以展翅高飞。 在我们的科学课堂上,确实会经常出现上述现象:在兴致高涨的讨论或在实验结论取得

关于数据库设计中主键问题的思考

关于数据库设计中主键问题的思考 文章摘要:数据库主键在数据库中占有重要地位。主键的选取策略决定了系统是否可靠、易用、高效。本文探讨了数据库设计过程当中常见的主键选取策略,并剖析了其做主键的优缺点,提出了相应的解决问题的方法。 关键字:自增标识GUID COMB 在基于关系型数据库设计时候,通常要为每张表指定一个主键,所谓主键就是能够唯一标识表中某一行记录的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除、修改时不出现错误。当然,其它字段可以辅助我们在执行这些操作时消除共享冲突,不是本文讨论的重点,不再赘述。主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致。所以数据库在设计时,主键起到了很重要的作用。常见的数据库主键选取方式有:自动增长式、手动增长式、UniqueIdentifier、联合式(复合式)、时间序列+随机数式、“COMB(Combine)”类型。 一、自动增长式 很多数据库设计者喜欢使用自动增长型字段,因为它使用简单。自动增长式允许我们在向数据库添加数据时,不考虑主键的取值,记录插入后,数据库系统会自动为其分配一个值,确保绝对不会出现重复。如果使用SQL Server数据库的话,我们还可以在记录插入后使用@@IDENTITY全局变量获取系统分配的主

键值。 尽管自动增长式字段会省掉我们很多繁琐的工作,但使用它也存在潜在的问题,那就是在数据缓冲模式下,很难预先填写主键与外键的值。假设有主辅两张表: Order(OrderID, OrderDate) 订单表 OrderDetial(OrderID, LineNum, ProductID, Price) 订单明细表Order 表中的OrderID是自动增长型的字段。假设现在需要我们录入一张订单,包括在Order表中插入一条记录以及在OrderDetail表中插入若干条记录。因为Order表中的OrderID是自动增长型的字段,那么我们在记录正式插入到数据库之前无法事先得知它的取值,只有在更新后才能知道数据库为它分配的是什么值。这会造成以下矛盾发生: 首先,为了能在OrderDetail的OrderID字段中添入正确的值,必须先更新Order表以获取到系统为其分配的OrderID值,然后再用这个OrderID填充OrderDetail表的OrderID列。最后更新OderDetail表。但是,为了确保数据的一致性,Order与OrderDetail在更新时必须在事务模式下进行的,即要么两张表同时同时更新成功、要么全部失败,显然它们是相互矛盾的。 其次,当我们需要在多个数据库间进行数据的复制时(SQL Server的数据分发、订阅机制允许我们进行库间的数据复制操作),自动增长式字段可能造成数据合并时的主键冲突及表关联关系的丢失。设想一个数据库中的Order表向另一个库中的Order

JAVA EE试题_已整理(含答案)

JAVA EE期末考试复习材料 一、选择题: 5、以下哪个HIbernate主键生成策略是实现主键按数值顺序递增的?(A) A) increment B)Identity C)sequence D)native 6、在JSP中,Page指令的(B)属性用来引入需要的包和类。 A)Exends B)import C)language D)contentType 7、从以下哪个选项中可以获得Servlet的初始参数(C) A)Servlet B)ServletContext C)ServletConfig D)GenericServlet 8、以下关于HIbernate说法正确的是(A) A)Hibernate是ORM的一种实现方式。 B)Hibernate不要JDBC的支持。 C)属于控制层 D)对象关系映射,让对象同数据库表产生关系。 9、下面关于OPM的说法不正确的是(C) A)持久化是将程序中数据在瞬时状态和持久状态间转换的机制。 B)瞬时状态是指程序数据保存在内存中,程序退出时,数据就不存在了。 C)把关系数据库中的数据读出来不属于持久化。 D)程序数据直接保存成文本文件属于持久化。 10、下面关于SessionFactory的说法正确的是(B)

A)SessionFactory是轻量级的,可以随意创建和销毁。 B)SessionFactory是重量级的接口,不可以随意创建和销毁。 C)SessionFactory是重量级的类,不可以随意创建和销毁。 D)SessionFactory是类。 11、下面关于Hibernate中load和get的方法说法正确的是(D) A)两个方法是一样的,没有任何区别。 B)两个方法是不一样的,get先找缓存,再找数据库。 C)两个方法是不一样的,load每次都会找数据库。 D)以上说法都不对。 12、spring能管理的组件不包括(A) A)Jsp B)javabean C)pojo D)DAO 二、简答题: 1、创建一个遵循Servlet规范的java类,有几种方法?分别是哪几种? 答:7种。分别是:doGet、doPost、doPut、doDelete、doHead、doOpinion、doTrace. 2、简要说明JSP的运行原理?(过程) 答:所有JSP页面,在执行的时候都会被服务器端的JSP引擎转换为Servelet(.java),然后又由JSP引擎调用Java编译器,将Servelet (.java)编译为Class文件(.class),并由Java虚拟机(JVM)解释执行。 3、简述struts的原理或画出原理图?

Mysql Hibernate Spring 的配置及jdbc连接简单程序

Mysql Hibernate Spring 的配置

hibernate数据持久化组件

hibernate数据持久化组件 1.基本概念: 1)对象持久化:把数据保存在永久的存储介质中(数据库)。 2)ORM(object relation mapping)对象关系映射。 3)POJO(PlainOldJavaObject)类是标准的Java Bean。PO持久化对象用于插入数据时候所使用POJO对象,BO业务对象,VO值对象 4)Hibernate就是一个可以自动的根据xml完成对象关系映射,并持久化到数据库的开源组件,底层也是由JDBC实现的。通过xml文件的配置,对数据库的底层的方言,以及数据库连接所需的信息,以及连接数据库的驱动。 5)hibernate的系统配置文件的名字一般叫做hibernate.cfg.xml,一般是映射类名.hbm.xml。一般将映射类的xml文件和实体类放在一起。 a)对象映射元文件: hibernate的映射类的XXXX.hbm.xml的写法(XXX一般跟所对应的POJO类的类名相同) package:映射类所在的包,注意:包中间用"."隔开 将类和数据库的表联系起来 声明标识属性,这个属性在PO中是必须的,所以一般创建对应表时必须定义主键,否则hibernate会将所有的列识别为一个复合主键 用于定义主键生成策略, assigned指定主键生成策略为用户指定,identity用于指定主键采用底层数据库提供的自增长 类中的属性和字段之间建立联系 在hibernate中其他类型可以自动识别只有Date类型必须指定,因为这里需要决定对应的时间精度问题

课堂教学中生成性问题的应对策略

课堂教学中生成性问题的应对策略 在课堂教学中,我们经常会遇到各种各样的生成性问题,这些问题如果处理不当,可能会影响课堂的教学节奏和教学氛围,甚至会影响课堂教学的进程和教学效果。因此,重视课堂教学中的生成性问题,智慧应对这些问题具有重要意义。 一、课堂教学生成性问题的一般特点 课堂教学生成性问题是指教师与学生、学生与学生、学生与文本在一定的课堂教学情境中,随机出现的教师预期之外的超出预设方案的影响课堂氛围、师生思路及行为的即时信息。随着地理新课程改革的深入实施,学生在课堂中的主体性、自主性不断增强,课堂变得更加自主、更加开放,生成的问题也更加多样化、复杂化。 在课堂中教师要善于捕捉各类生成性问题。这些生成性问题一般具有以下特点:一是生成性。例如,师生、生生之间在课堂对话中因思维融合、思想碰撞、合作探究、成果展示、总结反思而即时生成的新情境、新发现、新思维、新方法、新疑问,这些问题的生成是即兴的,是随机的,是来自课堂自身的。二是动态性。课堂中生成的问题,会随着教师应对方法的不同而发展,有的可能会衍生出新的问题,从而使生成问题具有不确定性、动态性。三是多样性。课堂中生成性问题的存在和表现的形式多种多样,学生提出一个教师意想不到的地理问题、教学进程中的一次突然冷场、一次干扰教学活动的突发事件等都是地理课堂教学中的生成性问题。四是隐蔽性。课堂中大量的生成性问题不是显性的,而是隐蔽的,有些甚至是稍纵即逝的,例如学生心中的一个疑问、教师一句影响学生思维判断取向的口误等。 二、课堂教学生成性问题的应对现状 课堂中许多生成性问题对教学活动具有积极作用,教师利用好这些生成性问题,将其变成新的教学资源,转化成课堂教学的新亮点,会使教学活动更加精彩,对师生的成长会产生积极的价值。然而,在课堂教学中面对大量蕴涵教育契机的生成性问题,许多教师面临进退两难的局面,原本鲜活的课堂并没有因此而灵动起来,预设与生成并没有达到和谐与融合。就目前课堂教学现状来看,教师应对课堂教学生成性问题,大致有以下三种情形。 1.教师过于强调预设,对生成问题置之不理 新课程改革背景下的课堂,应该是师生互动、心灵对话的舞台,应该是知识、生活与生命共鸣的乐园。然而,在实际课堂教学中,不少教师仍然固执于“表演教案剧”,忽视了课堂的民主性、开放性和生态化特征。有的教师在课前备课、设计教学方案时,往往是按照知识目标和个人思维方式对教学过程进行“周密”预设,甚至课堂中每个教学环节或每个知识要点讲授的时间或回答问题的学生代表等都事先进行了安排,课堂教学完全按照教师的意志来展开和推进。这样的课堂,无疑会使蕴涵生机和变化的课堂教学活动变成机械执行教案的过程,造成了教学活动的僵化和刻板,从而使学生生态主体居于被动、压抑的状态,抑制了学生主体能动性的发挥和创造力的发展。这种预设看似周密严谨,却忽视了课堂教学中即时生成的信息资源。有时,即使在课堂中出现具有潜在价值的

最新版本Struts2.3.12+Spring3.2.2+Hibernate4.2.0框架配置详细步骤

SSH框架搭建 Struts2.3.12+Spring3.2.2+Hibernate4.2.0 编号:SSH-S2-S3-H4 版本:V1.1 级别:公开 编写时间:2013-03-18

目录 1 导言 (1) 1.1 目的 (1) 1.2 范围 (1) 1.3 说明 (1) 2 搭建Struts2 (2) 2.1 搭建所需jar包 (2) 2.2 整合步骤 (2) 2.2.1 创建项目 (2) 2.2.2 导入jar包 (2) 2.2.3 配置web.xml (4) 2.2.4 创建web (4) 2.2.5 创建jsp页面 (5) 2.2.6 配置struts.xml (6) 2.2.7 配置Tomcat (6) 2.2.8 部署项目 (7) 2.3 测试 (8) 2.3.1 启动Tomcat (10) 2.3.2 测试Tomcat (10) 2.3.3 测试Struts (11) 3 整合Spring3 (12) 3.1 整合所需jar包 (12) 3.2 整合步骤 (12) 3.2.1 导入jar包 (12) 3.2.2 配置web.xml (12) 3.2.3 配置struts.xml (13) 3.2.4 配置spring.xml (13) 3.3 测试 (14)

3.3.1 启动Tomcat (14) 3.3.2 测试登录 (14) 4 整合Hibernate4 (15) 4.1 整合所需jar包 (15) 4.2 整合步骤 (15) 4.2.1 导入jar包 (15) 4.2.2 创建数据库ccc (15) 4.2.3 创建对象User (16) 4.2.4 生成映射文件User.hbm.xml (17) 4.2.5 创建dao (18) 4.2.6 创建service (19) 4.2.7 创建web (20) 4.2.8 配置jdbc.properties (21) 4.2.9 配置db.xml (22) 4.2.10 配置spring.xml (24) 4.2.11 配置struts.xml (24) 4.3 测试 (25) 4.3.1 启动Tomcat (25) 4.3.2 测试登录 (25)

JavaEE简答题

JavaEE简答题修改版(30分,6题*5分) (一)第一章概述 1.三层体系结构的优点有哪些?P2 ①安全性高; ②易维护; ③快速响应; ④系统扩展灵活。 2.两层体系结构的缺点有哪些?p2-3 ①安全性低; ②部署困难; ③耗费系统资源。 3.简述Java EE的“组件-容器”编程思想。(P5,有两点,与填空题第1题互斥) ①JavaEE应用的基本单元是JavaEE组件,所有的javaEE组件都运行在特定的环境中。 ②组件的运行环境被称为容器。 4.Java EE体系结构的优点?p11,4点 ①独立于硬件配置和操作系统; ②坚持面向对象的设计原则; ③灵活性、可移植性和互操作性; ④轻松的企业信息系统集成。 (二)第三章Servlet 5.Servlet的基本工作流程?p21:6点 ①客户端将请求发送到服务器; ②服务器上的Web容器实例化Servlet,并为Servlet创建线程; ③Web容器将请求信息发送到Servlet; ④Servlet创建一个响应,并将其返回到Web容器; ⑤Web容器将响应返回客户端; ⑥服务器关闭或Servlet空闲时间超过一定限度时,调用dertory()方法退出。

6.在创建Web应用程序时,通过Servlet上下文可以实现哪些功能?p61,4点 ①访问Web应用程序资源; ②在Servlet上下文属性中保存Web应用程序信息; ③获取应用初始化参数信息; ④提供日志支持。 7.HttpServletResponse的sendRedirect方法与RequestDispatcher的forward方法有什么区 别?p68:3点 ①从操作本质上,RequestDispatcher.forward()是容器控制权的转向,在客户端浏览器的地址栏中不会显示出转向后的地址,而sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求连接。 ②从性能上,前者仍是在同一次请求处理过程中,后者是结束第一次请求,由浏览器发起一次新的请求。因此前者更高效。 ③从跳转的范围上,HttpServletResponse()能够跳转到其他服务器上的资源,而RequestDispatcher.forward()只能转向Web应用内部的资源。 8.Filter的主要用途是什么?p69: 3点 ①访问特定资源时的身份验证; ②访问资源的记录跟踪; ③访问资源的转换。 (三)第四章JSP 9.列举JSP的5个内置对象,并做简要说明。 答:request、response、out、session、application、config、pageContext、page、exception (任选5个,并用一句话说明) ①request对象:代表来自客户端的请求,它封装了用户提交的信息; ②response对象:代表服务器对客户端的响应; ③out对象:代表向客户端发送数据的对象; ④application对象:代表运行在服务器上的Web应用程序,相当于Servlet上下文; ⑤exception对象:用来处理JSP文件在执行时所有发生的错误和异常。 10.与response.sendRedirect()实现重定位有何不同?p114 response.sendRedirect()其实是向浏览器发送一个特殊的Header,然后由浏览器来做转向,转到指定的页面,在浏览器上的地址栏上可以看到地址的变化; 而则不同,它是直接在服务器端执行重定位的,浏览器并不知道。

hibernate配置数据库连接池的三种方法

?数据库连接池的概念(是什么,做什么用的,有什么好处) ?首先,我们还是老套的讲讲连接池的基本概念,概念理解清楚了,我们也知道后面是怎么回事了。?以前我们程序连接数据库的时候,每一次连接数据库都要一个连接,用完后再释放。如果频繁的数据库操作,就会导致性能很低。连接池的出现,为开发过程提供了一个很好的管理平台。当程序中需要建立数据库连接时,只须从内存中取一个来用而不用新建。同样,使用完毕后,只需放回内存即可。而连接的建立、断开都有连接池自身来管理。同时,我们还可以通过设置连接池的参数来控制连接池中的连接数、每个连接的最大使用次数等等。通过使用连接池,将大大提高程序效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。 ?而Hibernate的出现把连接池的使用引入了一个新的利用方式,让你充分享受配置化给开发带来的便利。 1 C3P0 (以验证可用) 只需在hibernate.cfg.xml中加入 omdssd_admin omdssd_hskj jdbc:oracle:thin:@10.142.1.138:1521:omds oracle.jdbc.driver.OracleDriver org.hibernate.dialect.Oracle9Dialect true true oracle10g_112 org.hibernate.connection.C3P0ConnectionProvider 5 //连接池中数据库连接的最小数目 30 //连接池中数据库连接的最大数目 1800 //设定数据库连接的过期时间,以秒为单位 50 //可以被缓存的PreparedStatement实例的最大数目。缓存适量的PreparedStatement实例,能够大大提高Hibernate的性能。 120//在使数据库连接自动生效之前处于空闲状态的时间,以秒为单位

相关文档