快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
在这四种不用的 情况下,如何使用 OpenJPA 提供的注释,结合具体数据库支持的特性,如自增长 字段、序列号等来实现实体标识的自动生成。

容器自动生成

OpenJPA 容器默认的实体标识自动生成策略是由容器管理实体标识的自动 生成,容器管理的实体标识可以支持数值型和字符型两种。当容器管理的实体标 识是数字型时,OpenJPA 容器自动创建一个数据库表 OPENJPA_SEQUENCE_TABLE, 用其中的 SEQUENCE_VALUE 字段来记录实体的实体标识的增长。

当容器管 理的实体标识是字符串类型时,OpenJPA 支持使用 uuid-string 和 uuid-hex 两 种方式生成相应的实体标识。如果我们选择使用 uuid-string 方式生成实体标识 时,OpenJPA 框架会自动为实体生成一个 128 位的 UUID,并且将这个 UUID 转 化为使用 16 位字符表示的字符串。如果我们选择使用 uuid-hex 方式生成实体 标识时,OpenJPA 框架会自动为实体生成一个 128 位的 UUID,并且将这个 UUID 转化为使用 32 位字符表示的 16 进制的字符串。

数值标识

容器 管理的实体标识可以是数值型的,OpenJPA 框架管理的实体标识借助于数据库的 表来实现,在运行时 OpenJPA 框架会自动在数据库中创建表 OPENJPA_SEQUENCE_TABLE。它有两个字段:ID 和 SEQUENCE_VALUE ,这两个字段 都是数值类型,其中 ID 是表的主键字段,它的内容是查询当前实体标识时所使 用的关键词,默认值是 0。而 SEQUENCE_VALUE 记录了当前 OpenJPA 框架中当前 实体标识的历史数据,内容是已经被获取实体标识的最大数值加 1。

我们 要使用注释描述 Animal 实体的标识由容器自动生成,只需要为它的标识字段提 供 GeneratedValue 注释,并且把它的 strategy 属性设置为 GenerationType.AUTO , Animal 实体类的代码片断如下:

清单 1. 标识 由容器自动生成的 Animal 实体类

1. import  javax.persistence.Entity; 2. import  javax.persistence.GeneratedValue; 3. import  javax.persistence.GenerationType; 4. import  javax.persistence.Id; 5. 6. @Entity 7. public class  Animal { 8. @Id 9. @GeneratedValue (strategy=GenerationType.AUTO) 10. private long id; 11.  private String name; 12. 13.  … 14. 15.  }

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

时间:2011-08-31 IBM 肖菁

保存 Animal 实体的第一个实例时,OpenJPA 框架自动调用 SQL 语句 SELECT SEQUENCE_VALUE FROM OPENJPA_SEQUENCE_TABLE WHERE ID=0, 从默认保存实体标识的 OPENJPA_SEQUENCE_TABLE 表中获取实体的标识,如果不 存在 ID 为 0 的记录,OpenJPA 框架自动将实体的标识设置为 1。

容器 管理实体标识的情况下,为了获得实体标识,应用程序将不得不频繁地和数据库 交互,这会影响应用程序的运行效率。OpenJPA 中使用实体标识缓存机制解决这 个问题。默认情况下,当应用程序第一次获取实体标识时,OpenJPA 框架从数据 库中一次性获取 50 个连续的实体标识缓存起来,当下一次应用程序需要获取实 体标识时,OpenJPA 将首先检测缓存中是否存在实体标识,如果存在,OpenJPA 将直接使用缓存中的实体标识,如果不存在,OpenJPA 框架将会从数据库中再次 获取 50 个连续的实体标识缓存起来,如此类推。这样的处理方式可以大大减少 由于获取实体标识而产生的数据库交互,提升应用程序的运行效率。

当实 体标识成功获取之后,OpenJPA 框架会把当前实体标识的最大值 +1 后持久化到 数据库中。由于实体标识缓存的原因,当我们第一次获取实体标识后,OpenJPA 会将 OPENJPA_SEQUENCE_TABLE 表的 SEQUENCE_VALUE 的值设置为 51,当 OpenJPA 多次从数据库中获取实体标识后,SEQUENCE_V

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号