文档库 最新最全的文档下载
当前位置:文档库 › Hibernate主键生成策略

Hibernate主键生成策略

Hibernate主键生成策略

1、自动增长identity

适用于MySQL、DB2、MS SQL Server,采用数据库生成的主键,用于为long、short、int类型生成唯一标识

使用SQL Server 和MySQL 的自增字段,这个方法不能放到Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和SQL Server 中很常用)

数据库中的语法如下:

MySQL:create table t_user(id int auto_increment primary key, name varchar(20)); SQL Server:create table t_user(id int identity(1,1) primary key, name varchar(20));

2、sequence

DB2、Oracle均支持的序列,用于为long、short或int生成唯一标识

数据库中的语法如下:

Oracle:create sequence seq_name increment by 1 start with 1;

需要主键值时可以调用seq_name.nextval或者seq_name.curval得到,数据库会帮助我们维护这个sequence序列,保证每次取到的值唯一,如:

insert into tbl_name(id, name) values(seq_name.nextval, ‘Jimliu’);

seq_name

如果我们没有指定sequence参数,则Hibernate会访问一个默认的sequence,是

hibernate_sequence,我们也需要在数据库中建立这个sequence

此外,sequence还可以有另外一个参数是paramters,可以查看Hibernate的API了解它的用法,见org.hibernate.id.SequenceGenerator

调用数据库的sequence来生成主键,要设定序列名,不然hibernate无法找到:

NAME_SEQ(Oracle中很常用)

3、hilo

使用一个高/低位算法生成的long、short或int类型的标识符,给定一个表和字段作为高位值的来源,默认的表是hibernate_unique_key,默认的字段是next_hi。它将id的产生源分成两部分,DB+内存,然后按照算法结合在一起产生id值,可以在很少的连接次数内产生多条记录,提高效率MySQL:create table hi_value(next_hi integer not null);

insert into hi_value(next_hi) values(1);

hi_value

next_hi

100

在hibernate持久化的时候,由hibernate负责生成低位值。hilo标识符生成器在生成标识符时需要从hi_value表中取出next_hi的当前值,然后修改该值,这个操作是在单独的事务中完成的。最大的低值在属性max_lo中配置,但在Hibernate内存中生成的低位值超过此值时,就有需要到数据库的hi_value表中再次读取高位值了

使用hilo生成策略,要在数据库中建立一张额外的表,默认表名为hibernate_unique_key,默认字段为integer类型,名称是next_hi(比较少用)

我们也可以自己设置自定义的表名和字段名

4、native

会根据底层数据库的能力,从identity、sequence、hilo中选择一个,灵活性更强,但此时,如果选择sequence或者hilo,则所有的表的主键都会从Hibernate默认的sequence或者hilo表中取。并且,有的数据库对于默认情况主键生成测试的支持,效率并不是很高

对于oracle 采用Sequence 方式,对于MySQL 和SQL Server 采用identity(自增主键生成机制),native就是将主键的生成工作交由数据库完成,hibernate不管(很常用)

5、seqhilo

sequence和hilo的结合,hilo的高位由sequence产生,所以也需要底层数据库的支持

通过hilo算法实现,但是主键历史保存在Sequence中,适用于支持Sequence 的数据库,如Oracle(比较少用)

seq_name

100

6、increment

这个是由Hibernate在内存中生成主键,每次增量为1,不依赖于底层的数据库,因此所有的数据库都可以使用,但问题也随之而来,由于是Hibernate生成的,所以只

能有一个Hibernate应用进程访问数据库,否则就会产生主键冲突,不能在集群情况下使用

插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法

7、

uuid.hex

使用一个128-bit的UUID算法生成字符串类型的标识符,UUID被编码成一个32位16进制数字的字符串。UUID包含:IP地址、JVM启动时间、系统时间(精确到1/4秒)和一个计数器值(JVM 中唯一)

hibernate会算出一个128位的唯一值插入

uuid.string

hibernate会算出一个16位的值插入

8、assigned

由应用程序负责生成主键标识符,往往使用在数据库中没有代理主键,使用的主键与业务相关的情况,如:

这种主键的生成方式不建议使用,在数据库表设计时就应该使用代理主键(surrogate key),不应使用自然主键(natural key具有业务含义),在没有指定标签时,默认就是assigned 主键的生成方式

在插入数据的时候主键由用户自己添加,hibernate也不管

9、foreign

使用外部表的字段作为主键

10、select

使用触发器生成主键(主要用于早期的数据库主键生成机制,少用)

代理主键是指与业务无关且能唯一标识数据库中记录,一般是数据库自动生成的,比如mysql可以使

用auto_increment,Sql2000可以使用identity生成方式,oracle可以使用sequence生成方式自然主键指业务相关,由用户指定,且能唯一标识数据库中的任意一条记录

简介版:

increment:代理主键,适合于所有数据库,由hibernate维护主键自增,和底层数据库无关,但

是不适合于2个或以上hibernate进程。

identity:代理主键,适合于Mysql或ms sql server等支持自增的dbms,主键值不由hibernate 维护。

sequence:代理主键,适合于oracle等支持序列的dbms,主键值不由hibernate维护,由序列产生。

native:代理主键,根据底层数据库的具体特性选择适合的主键生成策略,如果是mysql或sqlserver,选择identity,如果是oracle,选择sequence。

hilo:代理主键,hibernate把特定表的字段作为hign值,生成主键值

uuid.hex:代理主键,hibernate采用uuid 128位算法生成基于字符串的主键值

assign:适合于应用程序维护的自然主键。

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,也需要在数据库中创建这个序列。

数据完整性约束-主键约束

数据完整性约束(一) —— SQL Server 2016数据库及应用

由于数据库中的数据是从外界输入的,然而数据的输入由于种种原因,会发生输入无效或错误信息,数据的完整性正是为了保证输入的数据符合规定而提出的。 数据完整性分为四类: 实体完整性、域完整性、参照完整性和用户自定义完整性。

1. 实体完整性: 实体完整性要求如果属性A是关系R的主属性,则属性A不能取空值。实体完整性用于保证关系数据库表中的每条记录都是唯一的,建立主键的目的就是为了实现实体完整性。 2. 域完整性: 用来保证数据的有效性,它可以限制录入的数据与数据类型是否一致,规定字段的默认值,设置字段是否可以为空,域完整性可以确保不会输入无效的数据。

3. 参照完整性:参照完整性是基于外键的,如果表中存在外键,则外键的值必须与主表中的某条记录的被参照列的值相同,参照完整性用于确保相关联表之间的数据保持一致。当添加、删除或修改数据表中记录时,可以借助于参照完整性来保证相关表之间数据的一致性。 ClassNo ClassName Specialty EnterYear Dno 0111801 网络3181 计算机网络技 术 2018 D01 0121901 软件3191 软件技术 2019 D01 主键 Class Sno Sname Sex Birth ClassNo s011180106 陈骏 男 2000/7/5 0111801 s012190118 陈天明 男 2000/7/18 0121901 主键 外键 Student

4. 用户自定义完整性: 用户自定义完整性约束就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。 如何实现数据完整性,可以通过为表的字段设置约束来保证表中数据完整性。

中文版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.能对自己的设计课题进行合理的定位。 二、教材分析 本节课的内容是在上节课提出了设计课题的基础上,继续学习设计定位。教材以“多功能文具盒”为载体,讲解设计定位相关的知识和操作方法、思考方法。理解相对简单,但是需要同学们结合自己的设计课题进行应用,要有清晰和周密的思路。因此,理解理论知识简单,但是进行设计定位的难点。

Spring的HibernateDaoSupport类详解

HibernateDaoSupport: (创建一个子类对象的时候,会先创建一个父类对象)。 当LogDAOImpl继承HibernateDaoSupport的时候,程序执行报错,原因是必须要注入SessionFactory或者HibernateTemplate。因为HibernateDaoSupport是abstract类,所以无法生成HibernateDaoSupport对象来实现注入;那我们只能生成其子类LogDAOImpl的对象,在调用HibernateDaoSupport类中的set方法进行注入,但这个方法还是不行,因为HibernateDaoSupport类中的set方法为final方法。总之,我们无法使用annotation方式在HibernateDaoSupport中注入SessionFactory或者HibernateTemplate。,那么我们的LogDAOImpl类就不能使用annotation的方式生成了,我们只能(暂且,以后会有其他方法)在beans.xml中进行注入如下: 使用这种方式进行注入,我们又会有另外一个问题:假如现在有很多的DAO的实现需要继承HibernateDaoSupport,那么我们在beans.xml文件中就需要配很多的,这样仅配置文件就非常庞大了。 到现在,我们已经知道了HibernateDaoSupport怎么使用了。 使用上面的方法直接继承HibernateDaoSupport比较复杂,现在介绍一种简便的方法:我们可以把DAO抽象处理,写一个抽象类,让它去继承HibernateDaoSupport,如下: 如下修改beans.xml文件,将sessionFactory注入给它:

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;

约束语法

SQL Server 2000支持下列五类约束:(1)DEFAULT约束(默认约束):当向数据库表中插入数据时,如果没有明确的提供输入值时,SQL S自动为该列输入指定值。(2)CHECK约束(检查约束):通过逻辑表达式判断限制插入到列中的值。(3)PRIMARY KEY约束(主键约束):不允许数据库表在指定列上具有相 同的值,且不允许有空值。(4)FOREIGN KEY约束(外键约束):定义数据库 表中指定列上插入或更新的数值必须在另一张被参照表中的特定列上存在。(5)UNIQUE约束(惟一约束):不允许数据库表在指定列上具有相同的值,但允许 有空值。约束也被分为列约束和表约束两类。列约束是指只对某一列起作用的约束。当一个约束中包含了数据库表中一个以上的列时,称为表约束。 24、约束的创建约束可以通过使用CREATE TABLE命令创建。具体语法如下: CREATE TABLE table_name (column_name data_type (NULL | NOT NULL)[[CONSTRAINT constraint_name]{PRIMARY KEY [CLUSTERED | NONCLUSTERED] | UNIQUE [CLUSTERED | NONCLUSTERED] | [FOREIGN KEY] REFERENCES ref_table [(ref_column)] | DEFAULT constant_expression | CHECK(logical_expression)}][,...]) 其中,各参数的意义 为: table_name:创建约束的表名称 column_name:创建约束的列的名 称 data_type:所在列的数据类型 constraint_name:新建约束的名称 [例题37] 在tsinghua数据库中创建一张用于教师信息管理的表teachers,表中包括的教师信息分别为:教师编号、教师姓名、性别、出身年月、所在系代号、职称、办公室电话号码、科研方向以及工作状态,在创建时定义有列约束和表约束。具体命令如下: use tsinghua CREATE TABLE tsinghua.dbo.teachers (TeacherID int NOT NULL, name nvarchar(5) NOT NULL, gender nchar(1) NULL, birthday datetime NULL, DeptCode tinyint NOT NULL, Title nvarchar(5) NULL, TelCode char(8) NOT NULL, aspect nvarchar(200) NULL, status nvarchar(5) NOT NULL CONSTRAINT DF_Status DEFAULT(' 在职'), CONSTRAINT PK_Teacher PRIMARY KEY CLUSTERED(TeacherID), CONSTRAINT FK_DeptCode FOREIGN KEY (DeptCode) REFERENCES dbo.departments(DeptCode), CONSTRAINT CK_TelCode CHECK(TelCode LIKE '627[0-9][0-9][0-9][0-9][0-9]'),) go 在这个例子中,用户可以看到我们使用的约束类型依次为非空约束、默认约束、主键约束、外键约束和检查约束。在结果显示窗口中可以看到错误提示: 服务器: 消息 1767,级别 16,状态 1,行 2 外键 'FK_DeptCode' 引用了无效的表 'dbo.departments'。服务器: 消息 1750,级别 16,状态 1,行 2 未能创建约束。请参阅前面的错误信息。 这是由于还没有在数据库tsinghua中创建外键约束FK_DeptCode所需表departments,用户可以通过下面指令先创建表departments: CREATE TABLE tsinghua.dbo.departments (DeptCode tinyint NOT NULL Primary Key, DeptName nchar(20) NOT NULL, TelCode char(8) NULL) go

hibernateJTA标记

https://www.wendangku.net/doc/ce7839432.html,/cnbxj/blog/item/810acd01ca716b0d1c95837c.html Hibernate JPA标记学习 1.@Entity 通过注释@Entity或者(@Entity())表示被标示的类对应数据库中的一张表。 } @Entity public class TravelProfile { ... } 上面的例子告诉O/R映射引擎,类TravelProfile是可以持久化的,同时它对应数据库中的一张表。但是它没有指明对应哪个数据库中的哪张表。 2.元数据映射标记 2.1 @Table @Table()标记为实体初始化一张表,定义如下: @Target({TYPE}) @Retention(RUNTIME) public @interface Table { String name() default ""; String catalog() default ""; String schema() default ""; UniqueConstraint[] uniqueConstraints() default {}; } Name:指明表的名字。(可选) Catalog:表示表的catalog.(可选) Schema:表示表的schema.(可选) uniqueConstraints:制定表的唯一约束。(可选) 因为所有的属性都是可选的,也就是说@Table可以在进行映射的时候可以不标明。当不标明的情况下表的名字就是实体的类名。表属于的schema就是所属实体单元集的schema(就是当前连接数据库的用户)。 下面给出的例子中,指明表为CUST,所属的schema为RECORDS: @Entity @Table(name="CUST", schema="RECORDS") public class Customer { ... } 2.2 @UniqueConstraint标记 @UniqueConstraint用来指定表字段的唯一约束,定义如下: @Target({}) @Retention(RUNTIME) public @interface UniqueConstraint { String[] columnNames(); } columnNames:制定唯一约束的字段。 @Entity @Table(

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

科学课堂生成性教学的策略 《科学新课程标准》倡导的就是生成性教学:即在弹性预设的前提下,在教学展开过程中由教师和学生根据不同的教学情境,自主构建教学活动的过程。主动把教师的心灵与学生的心灵相融,珍视学生变化的学习需要,精心“预设”与即时“生成”相统一的弹性调控过程,及时形成反思元教学。那么,以探究为主的科学生成性课堂一定会生机盎然,充满生命的气息与情趣。 新一轮课程改革的实施为课堂教学注入了新的活力和生机。但在教学过程中仍存在着一些弊端,集中表现在教师只重视研究教的内容的组织,而忽视从学的角度去思考学习内容的呈现方式,尤其忽视学习过程中生成性资源的开发和利用。新课程改革提出“把课堂还给学生,让课堂充满生命气息”,要求教师不仅在课堂上努力为每个学生的主动参与提供广泛的可能性,更应关注学生在课堂活动中的状态,在变动不已的课堂中发现、判断、整合学习活动中反馈出来的课程资源,并充分开发和利用这些生成资源,实现课堂教学的多姿多彩。 一、问题的提出 一次,本人承担了一节校内公开课:八年级下册第二章第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

实验七完整性约束的创建

实验七完整性约束的创建 一、实验目的 理解数据库完整性约束的概念,掌握SQL Server 2008的完整性约束的类型及相应的创建技术。 二、实验内容 1、定义和管理主键约束。 2、定义和管理唯一性约束。 3、定义和管理检查约束。 4、定义和管理外键约束。 5、定义和管理默认值约束。 三、实验指导 在关系数据库中,实体完整性约束、参照完整性约束和域完整性约束是必须满足的完整性约束条件。在SQL Server中,通过建立“约束”等措施来实现数据完整性约束,约束包括:主键(PRIMARY KEY)约束、唯一性(UNIQUE)约束、检查(CHECK)约束、默认值(DEFAULT)约束和外键(FOREIGN KEY)约束。约束的建立可以通过对象资源管理器进行操作,也可以利用T-SQL语句进行设置。 (一)主键(PRIMARY KEY)约束 主键约束指在表中定义一个主键来唯一标识表中每一行数据。 1、在SQL Server Management Studio中设置和修改主键 在表设计器中,单击要定义为主键的列的行选择器(如果要选择多列,在单击其他列的行选择器时按住Ctrl键)。然后右键单击该列的行选择器,选择“设置主键”命令,自动创建名为“PK_”(后跟表名)的主键索引。如图7.1所示。 2、利用T-SQL语句定义和修改主键 实验7.1 在教学管理数据库JXGL中创建学生表S的同时定义主键。 在数据库引擎查询文档中输入以下语句: USE JXGL GO CREATE TABLE S (

Sno char(8) PRIMARY KEY, Sname char(8), Sex char(2), Sage smallint, Sdept varchar(50) ) GO 注意:如果要设置多列的组合为主键,需要把主键定义为表级完整性约束。 图7.1 利用表设计器管理主键 实验7.2 在定义数据表S时没有定义主键,则需要添加主键。 在数据库引擎查询文档中输入以下语句: USE JXGL GO ALTER TABLE S ADD CONSTRAINT PK_Sno PRIMARY KEY clustered(Sno) GO 单击“执行”按钮则执行该程序段,这样就创建了名字为PK_Sno的主键。(二)唯一性(UNIQUE)约束

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的原理或画出原理图?

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.教师过于强调预设,对生成问题置之不理 新课程改革背景下的课堂,应该是师生互动、心灵对话的舞台,应该是知识、生活与生命共鸣的乐园。然而,在实际课堂教学中,不少教师仍然固执于“表演教案剧”,忽视了课堂的民主性、开放性和生态化特征。有的教师在课前备课、设计教学方案时,往往是按照知识目标和个人思维方式对教学过程进行“周密”预设,甚至课堂中每个教学环节或每个知识要点讲授的时间或回答问题的学生代表等都事先进行了安排,课堂教学完全按照教师的意志来展开和推进。这样的课堂,无疑会使蕴涵生机和变化的课堂教学活动变成机械执行教案的过程,造成了教学活动的僵化和刻板,从而使学生生态主体居于被动、压抑的状态,抑制了学生主体能动性的发挥和创造力的发展。这种预设看似周密严谨,却忽视了课堂教学中即时生成的信息资源。有时,即使在课堂中出现具有潜在价值的

hibernate学习笔记

第一次课: 持久化:就是把瞬时状态的数据转变为持久化状态的数据,这一个过程就是持久化。 (java中内存分为:栈(变量,方法,形参都是在栈上),堆(new出来的对象在堆上)) 1)瞬时状态:刚new出来,在内存中存在的对象就是瞬时状态的。如果程序结束,对象就会被回收。 2)持久化状态:在磁盘或者是数据库中存在的数据就是持久状态。 Hibernate是什么? 1)是一个优秀的持久化框架,对jdbc进行进一步的封装。(hibernate,ibatis )。 2)是一个ORM (Object relation mapping ). Mysql,oracle,access 是关系型数据库 = hibernate操作的是对象。 使用hibernate的步骤:1)新建项目 2)引入jar包(hibernate最少依赖8个jar包) 3)新建 hibernate配置文件(hibernate.cfg.xml) ,放在src根目录下面。 用于数据库的配置信息。 com.mysql.jdbc.Driver root abc jdbc:mysql:///fwcz org.hibernate.dialect.MySQLDialect create 4)写bean/vo类,并且编写映射文件。

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-D1 试题

**学院课程考试试卷课程名称:《Hibernate:使用Hibernate&EJB开发持久层企业及应用》(A)卷 年级:班级: 姓名:_______________ 学号:_________________ 考试(考查) 闭卷 题号1-20 21-40 41-50 总分 分数 选择题(每题2分,共计100分) 1. 一个持久化类的实例可能存在的状态有()。[选三项] A.瞬态 B.持久态 C.隔离态 D.游离态 2. 面向对象概念中的对象与面向关系概念中的()相对应。 A.表 B.表的行 C.表的列 D.表中行的数据 3. 下面说法正确的是()。[选三项] A.Hibernate是一个开放源代码的对象关系映射框架 B.Hibernate是对JDBC进行了轻量级的对象封装 C.Hibernate可以大大减少操作数据库的工作量 D.Hibernate提供了数据查询机制,但没有提供恢复机制 4. JDBC编程的缺点( acd)。[选三项] A.实现业务逻辑的代码和数据库访问代码掺杂在一起, 使程序结构不清晰,可读性差 B.在程序代码中嵌入面向关系的SQL语句,使开发人员 能完全运用面向对象的思维来编写程序 C.业务逻辑和关系数据模型绑定,如果关系数据模型发 生变化,例如修改了CUSTOMERS表的结构,那么必须手工修 改程序代码中所有相关的SQL语句,这增加了维护软件的难度 D.如果程序代码中的SQL语句包含语法错误,在编译时不 能检查这种错误,只有在运行时才能发现这种错误,这增加了 调试程序的难度

-------------------------------------- 装-------------------------------------- 订------------------------------线 ---------------------------------------- 5. Hibernate 映射文件中子元素用来设定标识符 生成器,下面哪些是Hibernate 提供的内置实现( ABD )。[选三项] A .hilo B .native C .assign D .indentity 6. 关于SessionFactory 说法不正确的是( )。[选两项]BC A .它是线程安全的 B .它不是线程安全的 C .它是轻量级的 D .一个SessionFactory 实例对应一个数据库 据存储源 7. 关于Session 说法正确的是( BCD )。[选三项] A .它是线程安全的 B .它不是线程安全的 C .它是轻量级的 D .Session 也被称为持久化管理器,它 提供了和持久化相关的操作 8. 关于Configuration 说法正确的是()。[选三项]ABD A .Configuration 类的构造方法把默认路径下的hibernate. cfg.xml(或hibernate.properties)配置文件中的配置信息读入 到内存 B .Configuration 对象用于配置且启动Hibernate C .获得Configuration 的方法:Configuration config = n ew Configuration();///··.config() D .Hibernate 应用通过Configuration 实例来指定对象-关系 映射文件的位置或者动态配置Hibernate 的属性 9. 关于Transaction 说法正确的是( )。[选三项]ABD A .事务Transaction 为应用程序指定以原子操作单元范围的对象 B .在做对数据库的增加、修改和删除时一定要加上Transaction C .在做对数据库的查询时一定要加上Transaction D .获得Transaction 的方法:Transaction tr = session.begin Transaction(); 10. 如果数据库是MySql 或者SQLServer ,generator 属性值不可以用下面

相关文档