23.9.4. 配置 EJB 2.x 的容器管理持久化

您可以配置 EJB 2.x 的容器管理持久化子系统以指定任何数量的密钥生成器。密钥生成器用于生成唯一的密钥以标识 CMP 服务持久化的每个实体。
您可以定义两种类型的密钥生成器:UUID 和 HiLo 密钥生成器。
基于 UUID 的生成器
基于 UUID 的生成器可用 UUID 创建密钥。基于 UUID 的生成器只需要具有唯一的名称,它不需要其他配置。
基于 UUID 的密钥生成器可以使用下列语法通过 CLI 添加:
/subsystem=cmp/uuid-keygenerator=UNIQUE_NAME:add

例 23.16. 添加 UUID 密钥生成器

要添加名为 uuid_identities 的基于 UUID 的密钥生成器,请使用这个 CLI 命令:
/subsystem=cmp/uuid-keygenerator=uuid_identities:add
这个命令创建的 XML 配置是:
<subsystem xmlns="urn:jboss:domain:cmp:1.0"> 
   <key-generators>
      <uuid name="uuid_identities" />
   </key-generators>
</subsystem>
HiLo 密钥生成器
HiLo 密钥生成器使用数据库来创建和存储标识密钥。HiLo 密钥生成器必须具有唯一的名称并配置指定用来存储数据、表名及存储密钥的字段的数据源的属性。
HiLo 密钥生成器可以使用下列语法通过 CLI 添加:
/subsystem=cmp/hilo-keygenerator=UNIQUE_NAME/:add(property=value, property=value, ...)

例 23.17. 添加 HiLo 密钥生成器

/subsystem=cmp/hilo-keygenerator=HiLoKeyGeneratorFactory:add(create-table=true,create-table-ddl="create table HILOSEQUENCES (SEQUENCENAME varchar(50) not null, HIGHVALUES integer not null, constraint hilo_pk primary key (SEQUENCENAME))",data-source=java:jboss/datasources/ExampleDS, id-column=HIGHVALUES,sequence-column=SEQUENCENAME,table-name=HILOSEQUENCES,sequence-name=general,block-size=10)
这个命令创建的 XML 配置是:
<subsystem xmlns="urn:jboss:domain:cmp:1.1">
     <key-generators>
         <hilo name="HiLoKeyGeneratorFactory">
             <block-size>10</block-size>
             <create-table>true</create-table>
             <create-table-ddl>create table HILOSEQUENCES (SEQUENCENAME varchar(50) not null, HIGHVALUES integer not null, constraint hilo_pk primary key (SEQUENCENAME))</create-table-ddl>
             <data-source>java:jboss/datasources/ExampleDS</data-source>
             <id-column>HIGHVALUES</id-column>
             <sequence-column>SEQUENCENAME</sequence-column>
             <sequence-name>general</sequence-name>
             <table-name>HILOSEQUENCES</table-name>
         </hilo>
     </key-generators>
 </subsystem>

注意

block-size 必须设置为 value !=0,否则生成的 PKey 不会递增,因此实体的创建会失败且抛出 DuplicateKeyException。

注意

使用群集时 select-hi-ddl 必须设置为 'FOR UPDATE' 以确保一致性。所有的数据库都不支持锁定功能。