快速业务通道

使用Apache OpenJPA开发EJB 3.0应用,第5部分: 实体标识的自动生成 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15

使用Apache OpenJPA开发EJB 3.0应用,第5部分: 实体标识的自动生成

时间:2011-08-31 IBM 肖菁

数据的唯一性是所有应用程序非常基本的要求,由开发者或者用户来维护这种 唯一性存在着较大的风险,因此,由系统自动产生唯一标识是一种常见的做法。 OpenJPA 中支持四种不同的实体标识自动生成策略:

容器自动生成的实体 标识;

使用数据库的自动增长字段生成实体标识;

根据数据库序 列号(Sequence)技术生成实体标识;

使用数据库表的字段生成实体标识 ;

这四种方式各有优缺点,开发者可以根据实际情况进行选择。

可选择的注释

要让容器和数据库结合管理实体标识的自动生成,根据实际 情况的不同,开发者可以选择 javax.persistence.* 包下面的 GeneratedValue 、SequenceGenerator、TableGenerator 三个注释来描述实体的标识字段。

@javax.persistence.GeneratedValue

每一个需要自动生成实体标 识的实体都需要为它的实体标识字段提供 GeneratedValue 注释和相应的参数, OpenJPA 框架会根据注释和参数来处理实体标识的自动生成。

使用 GeneratedValue 注释自动生成的实体标识可以是数值类型字段如 byte、short、 int、long 等,或者它们对应的包装器类型 Byte、Short、Integer、Long 等, 也可以是字符串类型。

GeneratedValue 注释可以支持两个属性 strategy 和 generator。

strategy

strategy 是 GenerationType 类型的枚 举值,它的内容将指定 OpenJPA 容器自动生成实体标识的方式。strategy 属性 可以是下列枚举值:

GeneratorType.AUTO

表示实体标识由 OpenJPA 容器自动生成,这也是 Strategy 属性的默认值。

GenerationType.IDENTITY

OpenJPA 容器将使用数据库的自增长字 段为新增加的实体对象赋唯一值,作为实体的标识。这种情况下需要数据库提供 对自增长字段的支持,常用的数据库中,HSQL、SQL Server、MySQL、DB2、Derby 等数据库都能够提供这种支持。

GenerationType.SEQUENCE

表示使用数据库的序列号为新增加的实体对 象赋唯一值,作为实体的标识。这种情况下需要数据库提供对序列号的支持,常 用的数据库中,Oracle、PostgreSQL 等数据库都能够提供这种支持。

GenerationType.TABLE

表示使用数据库中指定表的某个字段记录实体 对象的标识,通过该字段的增长为新增加的实体对象赋唯一值,作为实体的标识 。

使用Apache OpenJPA开发EJB 3.0应用,第5部分: 实体标识的自动生成(2)

时间:2011-08-31 IBM 肖菁

String generator

generator 属性中定义实体标识生成器的名 称。如果实体的标识自动生成策略不是 GenerationType.AUTO 或者 GenerationType.IDENTITY,就需要提供相应的 SequenceGenerator 或者 TableGenerator 注释,然后将 generator 属性值设置为注释的 name 属性值。

@javax.persistence.SequenceGenerator

如果实体标识的自动生 策略是 GenerationType.SEQUENCE,开发者需要为实体标识字段提供 SequenceGenerator 注释,它的参数描述了使用序列号生成实体标识的具体细节 。该注释支持以下四个属性:

表 1. SequenceGenerator 注释属性说明

属性 说明
name 该属性是必须设置的属性,它表示了 SequenceGenerator 注释在 OpenJPA 容器 中的唯一名称,将会被 GeneratedValue 注释的 generator 属性使用。将实体标 识的自动生成委托给数据库的序列号特性时,实体标识字段的 GeneratedValue 注释的 generator 属性的值必须和某个 SequenceGenerator 注释的 name 属性 值保持一致。
sequenceName 实体标识所使用的数据 库序列号的名称。该属性是可选的,如果我们没有为该属性设置值,OpenJPA 框 架将自动创建名为 OPENJPA_SEQUENCE 的序列号。如果一个 OpenJPA 容器中管理 的多个实体都选择使用序列号机制生成实体标识,而且实体类中都没有指定标识 字段的 sequenceName 属性,那么这些实体将会共享系统提供的默认名为 OPENJPA_SEQUENCE 的序列号。这可能引起实体类编号的不连续。我们可以用下面 的这个简单例子说明这种情况:假设 OpenJPA 容器中存在两个实体类 Dog 和 Fish,它们的实体标识字段都是数值型,并且都选择使用序列号生成实体标识, 但是实体类中并没有提供 sequenceName 属性值。当我们首先持久化一个 Dog 对 象时,它的实体标识将会是 1,紧接着我们持久化一个 Fish 对象,它的实体标 识就是 2,依次类推。
initialValue 该属性设置所 使用序列号的起始值。
allocationSize 一些数据库 的序列化机制允许预先分配序列号,比如 Oracle,这种预先分配机制可以一次性 生成多个序列号,然后放在 cache 中,数据库用户获取的序列号是从序列号 cache 中获取的,这样就避免了在每一次数据库用户获取序列号的时候都要重新 生成序列号。allocationSize 属性设置的就是一次预先分配序列号的数目,默认 情况下 allocationSize 属性的值是 50。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号