Hibernate主键生成策略

合集下载

hbm映射文件配置和主键生成策略

hbm映射文件配置和主键生成策略

hbm映射文件配置和主键生成策略1.hbm文件配置①配置类到指定数据库中表的映射.<?xml version="1.0" encoding="UTF-8"?>.<!DOCTYPE hibernate-mapping PUBLIC."-//Hibernate/Hibernate Mapping DTD 3.0//EN"."/dtd/hibernate-mapping-3.0.dtd">.<!-- 完成实体类和数据表映射-->.<hibernate-mapping>.<!-- 1、类与表的映射-->.<!--.name 类名.table 表名.catalog 数据库名.-->.<class name="cn.itcast.domain.Customer" table="customer"catalog="hibernate3day1">.<!-- 2、类中属性与表中数据列映射-->.<!-- 主键-->.<!--.name 属性名(类中).column 列名(表中).type 类型.-->.<id name="id" column="id" type="int">.<!-- 主键策略identity 主键自增长-->.<generator class="native"></generator>.</id>.<!-- 普通属性-->.<property name="name" column="name" type="ng.String"not-null="true"></property> <!-- java类型-->.<property name="age" column="age" type="int"></property>.<property name="city">.<column name="city" sql-type="varchar(20)"></column> <!-- SQL类型--> .</property>.</class>..<!-- 在配置文件中定义SQL,给SQL命名,在程序通过login 使用SQL -->.<sql-query name="login">.<![CDATA[select * from user where username= ? and password =?]]>.</sql-query>..</hibernate-mapping>* 在配置过程中,省略column 和 type ,如果不写column 生成列名就是属性名,不写type将按照类中属性类型自动映射* 配置列其它属性 unique="true" 唯一not-null="true" 非空length="20" 长度2.主键的生成策略在<id>元素中通过 <generator class="生成策略"></generator> 指定数据表主键生成策略常用六种主键生成策略①incrementincrement 标识符生成器由 Hibernate 以递增的方式为代理主键赋值原理:select max(id) , insert max(id)+1* 使用 increment 创建数据表没有主键自增长,通过hibernate在程序内部完成自增* 好处跨平台,缺点高并发访问时,可以出现主键冲突问题②identity (无线程问题)---- Mysqlidentity 标识符生成器由底层数据库来负责生成标识符, 它要求底层数据库把主键定义为自动增长字段类型原理:依赖数据库内部自增长,和hibernate无关* 创建数据表 `id` int(11) NOT NULL AUTO_INCREMENT* 优点,无需程序处理,数据库自己完成主键增长,缺点 Mysql支持自增主键,oracle 不支持③sequence --- Oraclesequence 标识符生成器利用底层数据库提供的序列来生成标识符原理:依赖数据库序列支持,和hibernate程序无关* Oracle 支持序列, Mysql 不支持序列* 序列原理create sequence customer_seq;insert into customer(id) values(customer_seq.nextval); 自动序列+1④nativenative 标识符生成器依据底层数据库对自动生成标识符的支持能力,来选择使用 identity, sequence 或 hilo 标识符生成器.* Mysql 自动选择 identity , oracle 自动选择 sequence⑤uuiduuid 的主键生成,采用String 类型主键随机生成32位字符串⑥assigned前五种策略,都是代理主键生成策略assigned 是自然主键生成策略 ---- 必须用户在程序中指定(无法自动生成)* 复合主键(联合主键),一个数据表中多列共同作为主键 -----复合主键是一种特殊 assigned 策略.<composite-id>.<!-- 配置多列-->.<key-property name="firstname"></key-property>.<key-property name="secondname"></key-property>.</composite-id>错误:Caused by: org.hibernate.MappingException: composite-id class must implement Serializable: cn.itcast.domain.Person复合主键类必须实现序列化接口。

软件开发框架(J2EE)Hibernate概述习题与答案

软件开发框架(J2EE)Hibernate概述习题与答案

一、多选题1.在Hibernate 主配置文件(hibernate.cfg.xml)中,以下哪个元素()为它的根元素。

A.<hibernate-configuration>元素B.<session-factory>元素C.<property>元素D.<mapping>元素E.<hibernate-mapping>元素2.在Hibernate 主配置文件(hibernate.cfg.xml)中,是通过哪个元素()来配置映射文件的。

A.<hibernate-configuration>元素B.<session-factory>元素C.<property>元素D.<mapping>元素E.<hibernate-mapping>元素3.下面关于Hibernate 的映射文件说法正确的有哪些()。

A.Hibernate 是以xml 格式的文件来指定对象与关系数据之间的映射B.在hibernate.cfg.xml文件中可以配置<mapping>元素的resource属性来指定映射文件C.配置映射文件时,需要遵循它对应的DTD 文件格式D.在映射文件中,<class>元素的<id>子元素只能出现一次E.<id>元素的<generator>子元素用来设定标识符生成器4.在Hibernate 的映射文件中,<id>元素的<generator>子元素用来设定标识符生成器,以下对常用的标识符生成器的用法说法正确的是()。

A.increment:适用于代理主键。

用于为long, short 或者int 类型生成唯一标识B.identity:适用于代理主键。

由底层数据库生成标识符C.sequence:适用于代理主键。

Hibernate 根据底层数据库的序列来生成标识符D.hilo:使用一个高/低位算法高效的生成long、short 或者int 类型的标识符E.seqhilo:使用一个高/低位算法来高效的生成long、short 或者int 类型的标识符,给定一个数据库序列(sequence)的名字5.Hibernate 采用xml 文件来配置对象—关系映射有哪些好处()。

JAVA笔试题

JAVA笔试题

JAVA笔试题科目试题类型题干选择题选项A<action name=”individualLoginForm” path=”/individualLo SSH单选题在Struts配置文件中配置了一个实现登陆功能的Action名为IndividualLoginAction,用户提交Hibernate是对JDBC轻量级的封装SSH单选题下列关于Hibernate说法正确的是()identitySSH单选题下列主键生成策略针对自增长Struts的Action类必须实现Action接口SSH单选题关于Action的说法,下列正确的是incrementSSH单选题在hibernate中,以下()主键生成策略不存在Spring是一系列轻量级JavaEE框架的集合SSH单选题下列关于Spring说法错误的是( )。

SSH单选题下面说法正确的是( )。

S pring配置文件的名字一定是applicationContext.xmlhibernate3也实现了依赖注入SSH单选题下面关于依赖注入说法正确的 ( )。

invalidateSSH单选题在ActionForm中,()方法用来验证的使用Struts框架时,这些组件必须继承ActionFormSSH多选题在构建视图(View)层使用的组件时,使用Struts框架和JSF框架有着明显的不同,区别在于()。

(选ActionServletSSH单选题下面哪个是Struts控制器()EJBSSH单选题J2EE规范中指定的J2EEAPI中不包括以下()JarSSH单选题JavaEE应用程序包含了Web组件,它可以被封装为()文件类com.test.LoginForm是org.apache.struts.action.ActionFo SSH单选题在使用Struts框架构建应用系统时,会在配置文件中出现如下配置信息:pageSSH多选题ActionForm的生命周期是()(选两项)SSH多选题以下哪两种状态没有关联数据)(选两项)临时态数据库连接信息SSH多选题下面()不是Hibernate.cfg.xml映射文件中包含的内容(选两项)SSH单选题Struts提供哪些视图层组件标签SSH单选题Struts提供哪些控制层组件标签htmlSSH单选题以下哪组标签不是struts提供的ActionSSH单选题下列哪项不是struts提供的Action类编写类继承ActionFormSSH单选题下面哪项是使用ActionForm不必须的SSH单选题下列哪项不是hibernate中Session类的方法savenativeSSH单选题下列哪项不是hibernate常见的id生成器映射文件名只能以.hbm.xml结尾SSH单选题下列关于hibernate映射文件说法正确的是SSH单选题下列哪项不是bean在hibernate中的状态持久状态load方法可以根据主键加载一个对象SSH单选题关于hibernate session的get,load方法描述错误的是Query对象通过session.createQuery()方法创建SSH单选题下列关于hibernate的Query接口说法错误的是SSH单选题下列关于hql的说法正确的是from关键字后使用类名session的load方法默认会使用延迟加载SSH单选题下列关于hibernate延迟加载说法错误的是依赖注入指的是对象之间的关系在运SSH单选题下列关于依赖注入(DI)说法错误的是before adviceSSH单选题下列哪项不属于Spring的advice类型bean就是被Spring管理的对象SSH单选题下列关于Spring中的bean描述错误的是Hibernate的SessionFactory可以由Spring创造SSH单选题下列关于Hibernate与Spring的整合说法错误的是SSH单选题下列关于Struts Action的execute方法签名描述正确的是execute(ActionMapping mappireset方法用于重新设置ActionForm属性值SSH单选题下列关于Struts ActionForm说法错误的是ActionSSH单选题在Struts实现的MVC框架中,()类是包含了excute方法的控制器类,负责调用模型的方法,控SSH单选题在基于Struts框架的Web应用中,下面关于Action类的说法正确的是Action类属于模型组件ActionForm Bean用来完成一些实际的业务逻辑SSH单选题在基于Struts框架的Web应用中,下面关于ActionForm Bean的说法正确的是this.saveErrors(request, erSSH单选题分析Action Bean的execute方法:p ublicActionForward execute(ActionMapping map<controller>SSH单选题在Struts配置文件中,()元素的processorClass属性用于配置RequestProcessor类。

hibernatemybatis内部测试笔试题

hibernatemybatis内部测试笔试题

ACCP7.0内部测试学期: Y2 模块:Java考试时间: 50分钟总分数:100分注意:1、请勿在试卷上留下笔迹2、交卷时试题和答案均要上交《使用Hibernate开发租房系统》内部测试笔试题一、选择题(共25题,每题2.5分,选择一项或多项,漏选错选不得分)1.在Hibernate中,以下关于主键生成器说法错误的是()。

A.increment可以用于类型为long、short或byte的主键B.identity用于如SQL Server、DB2、MySQL等支持标识列的数据库C.sequence用于如Oracle、SQL Server等支持序列的数据库D.native由Hibernate根据底层数据库自行判断采用何种主键生成策略,是由使用的数据库生成主键的值2.在Hibernate中,关于脏检查和刷新缓存说法正确的是()。

A.当事务提交时,会发生脏检查B.Session的flush( )方法是刷新缓存的方法C.在执行Session的commit( )方法之前不会调用Session的flush( )方法D.编写代码时,调用commit( )方法之前要调用flush( )方法3.使用HQL查询所有部门信息,以下正确的是()。

A.from DeptB.select * from cn.jbit.demo.entity.DeptC.select Dept from cn.jbit.demo.entity.Dept dD.select d from Dept d4.关于Query接口的list( )和iterate( )方法,说法正确的是()。

A.执行list( )方法,查询所有符合条件的记录B.执行iterate( )方法,查询所有符合条件的记录C.执行list( )方法,查询出所有符合条件的主键值D.执行iterate ( )方法,查询出所有符合条件的主键值5.在HQL中,关于Query接口绑定参数的方法,说法正确的是()。

Hibernate注解

Hibernate注解

Hibernate注解常用的hibernate annotation标签如下:@Entity--注释声明该类为持久类。

@Table(name="promotion_info")--持久性映射的表(表名="promotion_info)。

@Column(name=”DESC”,nullable=false,length=512)--用于指定持久属性或字段的映射列。

@Id--注释可以表明哪种属性是该类中的独特标识符(即相当于数据表的主键)。

@GeneratedValue--定义自动增长的主键的生成策略。

@Transient--将忽略这些字段和属性,不用持久化到数据库。

@Temporal(TemporalType.TIMESTAMP)--声明时间格式。

@Enumerated--声明枚举@Version--声明添加对乐观锁定的支持@OneToOne--可以建立实体bean之间的一对一的关联@OneToMany--可以建立实体bean之间的一对多的关联@ManyToOne--可以建立实体bean之间的多对一的关联@ManyToMany--可以建立实体bean之间的多对多的关联@Formula--一个SQL表达式,这种属性是只读的,不在数据库生成属性(可以使用sum、average、max等)@OrderBy--Many端某个字段排序(List)下面是对以上常用Hibernate注解标签的详细介绍与举例:@Entity--注释声明该类为持久类。

将一个Javabean类声明为一个实体的数据库表映射类,最好实现序列化.此时,默认情况下,所有的类属性都为映射到数据表的持久性字段.若在类中,添加另外属性,而非映射来数据库的, 要用下面的Transient来注解.@Table(name="promotion_info")--持久性映射的表(表名="promotion_info).@T able是类一级的注解,定义在@Entity下,为实体bean映射表,目录和schema的名字,默认为实体bean的类名,不带包名.示例:@Entity@T able(name="CUST", schema="RECORDS")public class Customer { ... }@Column(name=”DESC”,nullable=false,length=512)--用于指定持久属性或字段的映射列。

generatedvalue()主键生成策略

generatedvalue()主键生成策略

generatedvalue()主键生成策略(原创实用版)目录1.主键生成策略概述2.主键生成策略的分类3.主键生成策略的优缺点4.主键生成策略的选择建议正文1.主键生成策略概述在数据库设计中,主键是唯一标识一条记录的字段,其作用是确保数据的唯一性和完整性。

主键生成策略,即如何为数据库中的记录分配主键的策略,是数据库设计中的重要环节。

合理的主键生成策略能够提高数据库性能、降低数据冗余和保证数据安全。

2.主键生成策略的分类主键生成策略可以分为以下几类:(1)自增主键:自增主键是最常见的主键生成策略,其特点是主键值随着记录的插入而递增。

这种策略简单易实现,但可能导致主键值的浪费和分布不均。

(2)固定值主键:固定值主键是指在记录插入前,先为表定义一组固定的主键值。

这种策略适用于数据量较小且不会频繁增加或删除的场景。

固定值主键可以避免主键值的浪费,但插入记录时需要预先分配主键,可能导致性能下降。

(3)唯一约束主键:唯一约束主键是指在表中定义一个或多个唯一约束的字段,以保证数据的唯一性。

这种策略适用于对数据唯一性要求较高的场景,但需要注意索引和性能的问题。

(4)序列主键:序列主键是指使用数据库中的序列(Sequence)为记录分配主键。

这种策略适用于需要确保主键值有序且不重复的场景,但可能存在性能和冗余的问题。

3.主键生成策略的优缺点(1)自增主键:优点是简单易实现,缺点是可能导致主键值的浪费和分布不均。

(2)固定值主键:优点是可以避免主键值的浪费,缺点是插入记录时需要预先分配主键,可能导致性能下降。

(3)唯一约束主键:优点是能保证数据的唯一性,缺点是需要注意索引和性能的问题。

(4)序列主键:优点是确保主键值有序且不重复,缺点是可能存在性能和冗余的问题。

4.主键生成策略的选择建议(1)根据业务场景选择:根据实际业务需求和数据特点,选择适合的主键生成策略。

(2)考虑性能和扩展性:在选择主键生成策略时,应充分考虑其对数据库性能和扩展性的影响。

Hibernate基础知识详解

Hibernate基础知识详解

Hibernate基础知识详解<hibernate-mapping><class name="*.*.*" table="t_customer" catalog="***"><id name="id" column="c_id"><generator class="identity"/></id><property name="name" column="c_name" length="20"/><set name="orders" inverse="false" cascade="save-update"><key column="c_customer_id"/></set></class></hibernate-mapping>(1)统⼀声明包名,这样在<class>中就不需要写类的全名。

(2)关于<class>标签配置name 属性:类的全名称table 表的名称,可以省略,这时表的名称就与类名⼀致catalog 属性:数据库名称可以省略.如果省略,参考核⼼配置⽂件中 url 路径中的库名称(3)关于<id>标签,<id>是⽤于建⽴类中的属性与表中的主键映射。

name 类中的属性名称column 表中的主键名称 column 它也可以省略,这时列名就与类中属性名称⼀致length 字段长度type 属性指定类型<generator>它主要是描述主键⽣成策略。

Hibernate 考试题

Hibernate 考试题

Hibernate 考试题一.填空题:1. 对象关系映射(ORM)的基本原则是:类型(class)映射(),属性(property)映射(),关联关系(association)映射(),类型的实例或对象(instance | object)映射()。

2. Hibernate应用通常由四个部分组成,它们是使用Hibernate API的程序和(、、)。

3. Hibernate应用缺省的XML格式的配置文件名是(), 放置在()下;该配置文件的根元素是(),根元素的子元素是();配置数据库方言的属性名是();配置数据库连接的四种属性名是(、、、);配置映射资源的元素是(),如果映射用XML文件表示,用属性()表示,如果映射用标注(annotation)表示,用属性()表示。

4. Hibernate XML映射文件的根元素是();此根元素下主要的子元素是();映射实体类中表示主键的属性的元素是();映射实体类中普通属性的元素是();映射一对一关联关系的元素是();映射多对一关联关系的元素是();表示多对多关系用集合元素,这些集合元素是();描述外键用元素(); 如果一个类型不是实体,但它是某个实体的组成部分,我们用元素()表示;在描述继承关系时,如果用一张表对应整个类层次结构子类型用元素()描述,如果每个子类型对应各自的表子类型用()描述,如果只有真正的可实例化的子类型才对应表则子类型可用元素()或元素()描述;代表双向关联关系时表示是否维护表中外键关系的属性名是();代表级联操作的属性名是();使用乐观锁时我们通常会在实体类型中增加一整型或日期型的属性,在影射文件中用元素(或)描述。

5. 在Hibernate XML影射文件中描述主键生成机制用元素(),其属性描述了主键的生成策略,至少写出三种策略名(、、)。

6. 在Hibernate XML影射文件中级连操作的属性值至少写出三个(、、)。

7. 在Hibernate XML影射文件中描述HQL语句所用元素为()。

理解JPA注解@GeneratedValue的使用方法

理解JPA注解@GeneratedValue的使用方法

理解JPA注解@GeneratedValue的使⽤⽅法⼀、JPA通⽤策略⽣成器通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id,其⽣成规则由@GeneratedValue设定的.这⾥的@id和@GeneratedValue都是JPA的标准⽤法,JPA提供四种标准⽤法,由@GeneratedValue的源代码可以明显看出.Target({METHOD,FIELD})@Retention(RUNTIME)public @interface GeneratedValue{GenerationType strategy() default AUTO;String generator() default "";}其中GenerationType:public enum GenerationType{TABLE,SEQUENCE,IDENTITY,AUTO}JPA提供的四种标准⽤法为TABLE,SEQUENCE,IDENTITY,AUTO.TABLE:使⽤⼀个特定的数据库表格来保存主键。

SEQUENCE:根据底层数据库的序列来⽣成主键,条件是数据库⽀持序列。

IDENTITY:主键由数据库⾃动⽣成(主要是⾃动增长型)AUTO:主键由程序控制。

TABLE⽐较复杂,这⾥不讲解。

分别介绍其他三个:1.SEQUENCE实体类中的注解@Id@GeneratedValue(strategy =GenerationType.SEQUENCE,generator="aaa")@SequenceGenerator(name="aaa", sequenceName="seq_payment")@SequenceGenerator定义@Target({TYPE, METHOD, FIELD})@Retention(RUNTIME)public @interface SequenceGenerator {String name();String sequenceName() default "";int initialValue() default 0;int allocationSize() default 50;}name属性表⽰该表主键⽣成策略的名称,它被引⽤在@GeneratedValue中设置的“generator”值中。

hibernate uuid原理

hibernate uuid原理

hibernate uuid原理摘要:1.Hibernate UUID 简介2.Hibernate UUID 的生成原理3.Hibernate UUID 的应用场景4.Hibernate UUID 与数据库主键的关系5.如何自定义Hibernate UUID 生成策略正文:Hibernate 是一个广泛应用于Java 应用程序中的对象关系映射(ORM)框架。

在Hibernate 中,UUID(通用唯一标识符)被广泛应用于数据库表的主键生成。

本文将详细介绍Hibernate UUID 的原理、应用场景以及如何自定义生成策略。

1.Hibernate UUID 简介Hibernate UUID 是Hibernate 框架提供的一种生成主键的策略。

它可以生成一个32 位的、全局唯一的、时间戳无关的UUID。

UUID 由三部分组成:随机数、时间戳和命名空间。

其中,命名空间用于区分不同类型的UUID,例如:DNS、URL 等。

在Hibernate 中,我们主要关注的是随机数和时间戳。

2.Hibernate UUID 的生成原理Hibernate UUID 的生成原理主要依赖于Java 中的UUID 类。

UUID 类提供了两个静态方法:randomUUID() 和timeBasedUUID()。

randomUUID() 方法生成一个基于随机数的UUID,而timeBasedUUID() 方法生成一个基于时间戳的UUID。

Hibernate UUID 策略实际上是将这两种UUID 组合起来,生成一个新的UUID。

3.Hibernate UUID 的应用场景Hibernate UUID 主要应用于数据库表的主键生成。

在Hibernate 中,可以通过配置映射文件或使用注解来指定主键生成策略。

当使用Hibernate UUID 作为主键生成策略时,Hibernate 会自动为数据库表生成一个唯一的UUID 作为主键。

Hibernate注解用法总结

Hibernate注解用法总结

1.类级别注解@Entity 映射实体类@Table 映射数句库表@Entity(name="tableName") - 必须,注解将一个类声明为一个实体bean。

属性:name - 可选,对应数据库中的一个表。

若表名与实体类名相同,则可以省略。

@Table(name="",catalog="",schema="") - 可选,通常和@Entity配合使用,只能标注在实体的class 定义处,表示实体对应的数据库表的信息。

属性:name - 可选,表示表的名称,默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名catalog - 可选,表示Catalog名称,默认为Catalog("").schema- 可选, 表示Schema 名称, 默认为Schema("").2.属性级别注解@Id 映射生成主键@Version 定义乐观锁@Column 映射表的列@Transient 定义暂态属性2.1 与主键相关注解@Id - 必须,定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键,置于getXxxx() 前。

@GeneratedV alue(strategy=GenerationType,generator="") - 可选,用于定义主键生成策略。

属性:Strategy - 表示主键生成策略,取值有:GenerationType.AUTO- 根据底层数据库自动选择(默认),若数据库支持自动增长类型,则为自动增长。

GenerationType.I NDENTITY- 根据数据库的Identity字段生成,支持DB2、MySQL、MS、SQL Server、SyBase与HyperanoicSQL数据库的Identity类型主键。

GenerationType.SEQUENCE -使用Sequence来决定主键的取值,适合Oracle、DB2等支持Sequence的数据库,一般结合@SequenceGenerator使用。

generatedvalue()主键生成策略

generatedvalue()主键生成策略

generatedvalue()主键生成策略一、生成主键的意义在数据库系统中,主键是用来唯一标识一条记录的字段。

生成主键的目的是确保数据表中的记录具有唯一性,避免重复数据的出现。

主键可以是自然主键(如身份证号码、订单编号等),也可以是人工设置的主键(如自增ID)。

二、生成主键的方法1.自增ID自增ID是一种常用的生成主键的方法。

在数据库中创建一个整数类型的字段,每次插入新记录时,由数据库自动为该字段赋值。

自增ID的优点是简单易实现,缺点是当数据表中已存在大量记录时,ID的生成速度会受到影响。

2.UUIDUUID(Universally Unique Identifier)是一种通用唯一标识符,可用于生成全局唯一的主键。

UUID的生成方式有很多种,如使用时间戳、MD5散列等。

UUID的优点是生成的字符串长度较短,便于存储和传输;缺点是UUID 的字符串形式可能含有特殊字符,不利于数据库字段的美观。

3.数据库生成策略数据库生成策略是指利用数据库自身的功能来生成主键。

例如,在MySQL中使用AUTO_INCREMENT关键字,Oracle中使用SEQUENCE对象等。

这种方法的优点是可以充分利用数据库的性能,缺点是需要对数据库进行额外的配置。

三、生成主键的优缺点1.自增ID优点:- 简单易实现,无需额外配置;- 在小规模数据表中,性能影响较小。

缺点:- 当数据表规模较大时,ID生成速度减慢;- 数字类型的ID可能存在重复可能性。

2.UUID优点:- 生成的字符串长度较短,便于存储和传输;- 全局唯一性,避免ID重复。

缺点:- UUID的字符串形式可能含有特殊字符,不利于数据库字段的美观;- 生成速度较慢,性能影响较大。

3.数据库生成策略优点:- 充分利用数据库性能,提高ID生成速度;- 自动维护主键顺序,无需额外操作。

缺点:- 需要对数据库进行额外的配置;- 在某些数据库中,可能存在并发冲突的问题。

四、适用场景的选择在实际项目中,选择生成主键的方法需根据项目需求和数据库特性进行权衡。

hibernate.hbm.xml配置详解

hibernate.hbm.xml配置详解

Hibernate中hbm.xml配置说明。

在Hibernate中,各表的映射文件….hbm.xml可以通过工具生成,例如在使用MyEclipse开发时,它提供了自动生成映射文件的工具。

配置文件的基本结构如下:Xml代码1<?xml version="1.0"encoding='UTF-8'?>23<!DOCTYPE hibernate-mapping PUBLIC4"-//Hibernate/Hibernate Mapping DTD 3.0//EN"5"/hibernate-mapping-3.0.dtd">6<hibernate-mapping package="包名">7<class name="类名"table="表名">8<id name="主键在java类中的字段名"column="对应表中字段"type="类型">9<generator class="主键生成策略"/>10</id>1112……13</class>14</hibernate-mapping>1. 主键(id)Hibernate的主键生成策略有如下几种:1) assigned主键由外部程序负责生成,在save() 之前指定。

2) hilo通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。

3) seqhilo与hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的Sequence,适用于支持Sequence 的数据库,如Oracle。

4) increment主键按数值顺序递增。

generatedvalue()主键生成策略

generatedvalue()主键生成策略

generatedvalue()主键生成策略`@GeneratedValue`是Java持久化(JPA)中用于指定主键生成策略的注解。

它通常与`@Id`注解一起使用,用于表示实体类的主键字段。

在JPA中,`@GeneratedValue`主要用于指定主键的生成方式。

常见的主键生成策略包括:1.IDENTITY:使用数据库的自增长列。

适用于支持自增列的数据库,如MySQL、SQL Server。

```java@Id@GeneratedValue(strategy=GenerationType.IDENTITY)private Long id;```2.SEQUENCE:使用数据库的序列。

适用于支持序列的数据库,如Oracle。

```java@Id@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="sequence_generator")@SequenceGenerator(name="sequence_generator",sequenceName="custom_sequence")private Long id;```3.TABLE:使用数据库表模拟序列。

适用于不支持序列或自增列的数据库。

```java@Id@GeneratedValue(strategy=GenerationType.TABLE,generator="table_generator")@TableGenerator(name="table_generator",table="id_generator_table", pkColumnName="gen_name",valueColumnName="gen_value",allocationSize=1)private Long id;```这些例子中的`@GeneratedValue`注解中的`strategy`属性用于指定生成策略。

generatedvalue生成策略

generatedvalue生成策略

generatedvalue生成策略GeneratedValue生成策略是Java中的一种机制,用于定义在自动为实体生成主键时所使用的策略。

该机制有助于减轻开发人员的工作负担,同时确保数据库的一致性和完整性。

在Java中,我们通常使用关系型数据库来存储数据。

每个表都有一个主键,作为数据的唯一标识。

通常情况下,主键是由开发人员手动分配的。

这种方法需要开发人员持续的、人工的投入,而且可能存在主键数据覆盖的风险。

为了解决这些问题,开发人员可以使用自动生成主键的方法。

@GeneratedValue生成策略使开发人员无需手动分配主键。

相反,它让开发人员定义在自动分配主键时使用的策略。

Java中提供了多种GeneratedValue生成策略。

下面我们将详细讨论这些策略。

1. AUTOAUTO是默认的GeneratedValue生成策略,它表示实现程序(如Hibernate)自动选择最适合底层数据库的策略。

例如,在MySQL中,它将为您选择Identity Identity;而容器支持分配的方式,如在EJB2.x使用容器分配主键。

2. IDENTITYIDENTITY策略在数据库表中使用自增长列。

当插入行时,数据库会自动生成自增列的值,并将其赋值给主键列。

IDENTITY通常在Oracle和SQL Server中使用。

3. TABLETABLE策略通过一个特定的数据库表来维护主键生成。

此表将有一列来存储下一个可用的主键值。

每次需要生成新的主键时,程序将请求此表的下一个可用主键值。

这种方法可以在任何数据库中使用,但是它会增加数据库的负担,可能会导致性能问题。

4. SEQUENCESEQUENCE策略与TABLE策略非常相似。

它使用数据库的序列来生成主键值。

当需要生成新的主键时,程序将请求下一个序列值。

SEQUENCE策略通常在Oracle中使用。

5. UUIDUUID策略使用Java的UUID生成器来生成主键值。

Hibernate学习总结

Hibernate学习总结

一.对象语言和操作数据库不匹配:模型不匹配(阻抗不匹配)①.可以使用JDBC手动转换;sql参数和jdbc中用对象赋值②.使用ORM(Object Relation Mapping对象关系映射)框架:hibernate 二.Hibernate安装配置①.配置文件Hibernate.cfg.xml和Hibernate.properties②.映射文件xxx.hbm.xml:对象模型和关系模型的映射三.开发流程1.由Domain Object -> mapping -> db2.有DB开始,用工具生成mapping和Domain Object3.由配置文件开始四.Domain Object限制1.默认的构造方法(必须的)2.有无意义的标示符id(主键) 可选3.非final的,对懒加载有影响可选Configuration SessionFactory Session Transaction Query CriteriaConfiguration类Configuration类负责配置并启动Hibernate,创建SessionFactory对象。

在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory 对象。

SessionFactory接口SessionFactory接口负责初始化Hibernate。

它充当数据存储源的代理,并负责创建Session对象。

这里用到了工厂模式。

需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。

Session接口Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。

JAVA(含SSH)考试题

JAVA(含SSH)考试题

JA V A 试题(总分:100,时间:60分钟)一、选择(含多选):2分/题1. 运行运行.class .class .class的命令包括(多选)的命令包括(多选)的命令包括(多选)AC ACA :javaB :javac C :javaw D :javah 2. 下面哪些条语句可以正确输出“下面哪些条语句可以正确输出“Hello Hello World!” (多选)A :System.println("Hello World!"); B :println("Hello World!"); C :System.err.println("Hello World!"); D :System.out.println("Hello World!"); 3. 看下面一段看下面一段JAVA JAVA JAVA程序:程序:程序:B Bin = 6; int j = ++i + i--;//++i=7 i--=7 [二元运算符先算前面] System.out.println("j=" + j); 问:程序执行结果是什么?问:程序执行结果是什么?A :12 B :14C :16 D :18 4. 看下面一段看下面一段JAVA JAVA JAVA程序程序程序D Dfinalintk = 1; k = 1 + 2 * 3 / 4; 哪一个描述正确哪一个描述正确A :k=1 B :k=2.5 C :k=2 D :不能执行5. 下面哪些变量名是正确(多选)下面哪些变量名是正确(多选)BCDFIJ BCDFIJA :intB :anIntC :ID :i1E :1F :thing1G :1thingH :ONE-HUNDREDI :ONE_HUNDRED J :something2do6. 下面哪个描述是正确的下面哪个描述是正确的C CA :使用Hashtable 比Hashmap 效率更高,Vector 比ArrayList 效率更高效率更高B :使用Hashtable 比Hashmap 效率更高,ArrayList 比Vector 效率更高效率更高C :使用Hashmap 比Hashtable 效率更高,ArrayList 比Vector 效率更高D :使用Hashmap 比Hashtable 效率更高,Vector 比ArrayList 效率更高效率更高7. Java 为变量和访问提供的所有访问级依次为:为变量和访问提供的所有访问级依次为:B BA :public > private protect > protect > private B :public > protect > private protect > private C :public > protect > private D :public > private > protect 8. Char 的数字范围是BA : 0 . . . 32767 B.:0 . . . 65535 C.:-256 . . . 255 D.:-32768 . . . 32767 E.:range is pla orm dependent 9. 以下哪个以下哪个Hibernate Hibernate 主键生成策略是实现主键按数值顺序递增的?主键生成策略是实现主键按数值顺序递增的?A AA. incrementB. identityC. sequenceD.native10. 在jsp jsp中,中,中,page page 指令的()属性用来引入需要的包或类。

Hibernate主键、外键各类配置实例

Hibernate主键、外键各类配置实例

Hibernate学习1、单主键、没有外键的Hibernate配置实例<hibernate-mapping><class name="com.pms.bean.base.BadCodeBean"table="tbNC"> <id name="badCode"column="NC_ID"><generator class="assigned"/></id><property name="desc"type="string"column="NC_DESC"></property> </class></hibernate-mapping>2、单主键、有外键的Hibernate配置实例<hibernate-mapping><class name="com.pms.bean.base.ProjectBean"table="tbProject"> <id name="prjname"column="PRJ_NAME"type="string"><generator class="assigned"></generator></id><many-to-one name=”customerCode”class=”com.pms.bean.base.CustomerBean”outer-join=”ture”not-null=”true”lazy=”false”><column name=”PRJ_CU_CODE”></column></many-to-one></hibernate-mapping>3、双主键、没有外键的Hibernate配置实例<hibernate-mapping><class name="com.pms.bean.base.LocationBean"table="tbLocation"> <composite-id><key-property name="lgort"column="LO_LGORT" type="string"><key-property name="werks"column="LO_WERKS" type="string"> </composite-id></class></hibernate-mapping>4、双主键、有外键的Hibernate配置实例<hibernate-mapping><class name="com.pms.bean.base.DepartNcBean"table="tbNCDept"> <composite-id><key-property name="ncBean"column="NCD_ID " lazy="false"><key-property name="deptDialogBean"column="NCD_DeptID "lazy="false"></composite-id><many-to-one name=”badType”class=”com.pms.bean.base.BadTypeBean”outer-join=”ture”not-null=”true”lazy=”false”><column name=”NCD_BadTypeCode”></column></many-to-one></class></hibernate-mapping>5、双主键中的两个主键都被作为外键被调用的Hibernate配置实例详细举例讲解:例如工厂和生产调度员组合成双主键,现在有一个表里面有两个外键分别是工厂和生产调度员。

Hibernate 实体类 注解 大全

Hibernate 实体类 注解 大全
示例:
@Column(name="BIRTH",nullable="false",columnDefinition="DATE")
public String getBithday() {
return birthday;
}
7、@Transient
public User getUser() {
return user;
}
9、@JoinColumn
可选
@JoinColumn和@Column类似,介量描述的不是一个简单字段,而一一个关联字段,例如.描述一个@ManyToOne的字段.
name:该字段的名称.由于@JoinColumn描述的是一个关联字段,如ManyToOne,则默认的名称由其关联的实体决定.
catalog:可选,表示Catalog名称,默认为Catalog("").
schema:可选,表示Schema名称,默认为Schema("").
3、@id
必须
@id定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键.置于getXxxx()前.
4、@GeneratedValue(strategy=GenerationType,generator="")
@Entity
//继承策略。另一个类继承本类,那么本类里的属性应用到另一个类中
@Inheritance(strategy = InheritanceType.JOINED )
@Table(name="INFOM_TESTRESULT")
public class TestResult extends IdEntity{}
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

同时这种方式也需要在生成主键方式的配置文件中添加一个参数,如:
5.Native
该种主键生成策略比较灵活,也是最常用的一种,他会根据底层数据库的类型来判断使用何种生成策略,如果是mysql就会使用主键自动增长的方式实现如identity;如果是oracle则会使用sequence方式进行主键的生成,但是该sequence是hibernate默认提供的序列名称。

6.Hilo
该种主键生成策略通过高低位算法生成主键,需要一张额外的表默认为hibernate_unique_key,默认的字段为next_hi;我们也可以定义表的名字,同时需要给该表插入一条默认的数据,否则在对表进行数据插入的时候会报错,具体错误信息如下:
正常执行控制台将执行三条sql语句,其中两条是对next_hi表的操作,一条是操作表的插入数据语句,执行如下:
在xml文件中配置id的生成方式如下:
7.uuid
该中策略使用一个128-bit的UUID算法生成的唯一标识,需要注意的该表中主键的类型为字符串类型。

以上7中是比较常用的生成策略,还有些不经常使用的不做介绍。

相关文档
最新文档