快捷搜索:

使用 Apache OpenJPA 开发 EJB 3.0 应用,第 5 部分: 实

数据的独一性是所有利用法度榜样异常基础的要求,由开拓者或者用户来掩护这种独一性存在着较大年夜的风险,是以,由系统自动孕育发生独一标识是一种常见的做法。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

表示应用数据库中指定表的某个字段记录实体工具的标识,经由过程该字段的增长为新增添的实体工具赋独一值,作为实体的标识。

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

该时晔犊梢允鞘?道嘈妥侄稳?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

表示应用数据库中指定表的某个字段记录实体工具的标识,经由过程该字段的增长为新增添的实体工具赋独一值,作为实体的标识。

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。

@javax.persistence.TableGenerator

假如实体标识的自动生策略是 GenerationType.TABLE,开拓者必要为实体标识字段供给 TableGenerator 注释,它的参数描述了应用数据库表天生实体标识的详细细节。该注释支持下列属性:

表 2. TableGenerator 注释属性阐明

属性

阐明

name

该属性是必须设置的属性,它表示了 TableGenerator 注释在 OpenJPA 容器中的独一名称,将会被 GeneratedValue 注释的 generator 属性所应用。将实体标识的自动天生委托给数据库表时,实体标识字段的 GeneratedValue 注释的 generator 属性的值必须和某个 TableGenerator 注释的 name 属性值维持同等。

table

该属性设置的是天生序列号的表的名称。该属性并不是必须设置的属性,假如开拓者没有为该属性设置值,OpenJPA 容器将会应用默认的表名 OPENJPA_SEQUENCES_TABLE 。Value

该属性设置的是天生序列号的表中的主键字段的特性字符串值 ( 比如 customID ),该字段将保存代表每个实体对应的标识值对应的特性字符串。该属性并不是必须设置的属性,假如开拓者没有为该属性设置值,OpenJPA 容器将会应用默认值 DEFAULT 。可以为多个实体设置相同的 pkColumnValue 属性值,这些实体标识的天生将经由过程同一列的值的递增来实现。

initialValue

该属性设置的是天生序列号的表实体标识的初始值。该属性并不是必须设置的属性,假如开拓者没有为该属性设置值,OpenJPA 容器将会应用默认值 0 。

allocationSize

为了低落标识天生时频繁操作数据库造成 的机能上的影响,实体标识天生的时刻会一次性的获取多个实体标识,该属性设置的便是一次性获取实体标识的数目。该属性并不是必须设置的属性,假如开拓者没有为该属性设置值,OpenJPA 容器将会应用默认值 50 。

实体标识自动天生

在上面的小节中,我们懂得了和实体标识自动天生相关的注释,接下来我们将结合一个简单的例子讲述若何分手应用这些实体标识自动天生策略实现实体标识的自动天生。

我们首先假设有一个 Animal 实体必要被持久化,它包括 ID 和 NAME 属性,此中 ID 是它的主键字段。Animal 实体的标识必要自动天生,我们将阐发在这四种不用的环境下,若何应用 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. }

保存 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_VALUE 的值会以 50 为单位递增,变为 101、151、201 …。

OpenJPA 缓存的实体标识不是永远存在的,只能在同一个 EntityManagerFactory 治理范围内起感化,也便是说,当获取实体标识的 EntityManagerFactory 工具被关闭后,这些被获取的实体标识中没有用掉落的那一部分标识就损掉了,这会造成实体标识的不继续。由同一个 EntityManagerFactory 工具创建的 EntityManager 高低文之间则能够共享 OpenJPA 框架获取的实体标识,这意味着,我们可以应用同一个 EntityManagerFactory 工具创建多个 EntityManager 工具,用它来持久化实体,然后关闭它,在持久化历程中所必要的实体表示将会应用同一个实体标识的缓存区,是以不会引起实体标识的损掉。

容器治理的实体标识还有一个异常紧张的特点:所有被容器治理的实体标识都是共享的。不管 OpenJPA 容器中存在若干个不合的被容器治理的实体标识,它们都邑从同一个实体标识缓存中获取实体标识。我们可以用下面的例子阐明这种环境:假设 OpenJPA 容器中存在两个实体类 Dog 和 Fish,它们的实体标识字段都是数值型,并且都由 OpenJPA 治理。当我们首先持久化一个 Dog 工具时,它的实体标识将会是 1,紧接着我们持久化一个 Fish 工具,它的实体标识便是 2,依次类推。

uuid-string

要应用 uuid-string 机制自动天生实体标识,我们必要将实体主键字段的 GeneratedValue 注释的 strategy 属性设置为 GenarationType.AUTO,然后将 GeneratedValue 注释的 generator 属性设置为 uuid-string。以 Animal 实体类为例,我们只必要将 Animal 实体改动为如下内容:

清单 2. 应用 uuid-string 机制自动天生实体标识

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, generator = "uuid-string")

10. private String id;

11. private String name;

12.

13.  …

14.

15. }

uuid-hex

要应用 uuid-hex 机制自动天生实体标识,我们必须将实体主键字段的 GeneratedValue 注释的 strategy 属性设置为 GenarationType.AUTO,然后将 GeneratedValue 注释的 generator 属性设置为 uuid-hex。以 Animal 实体类为例,我们只必要将 Animal 实体改动为如下内容:

清单 3. 应用 uuid-hex 机制自动天生实体标识

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, generator = "uuid-hex")

10. private String id;

11. private String name;

12.

13.  …

14.

15. }

自增长字段

自增长字段是 HSQL、SQL Server、MySQL、DB2、Derby 等数据库供给的一种特点,用于为数据库的记录供给自动增长的编号,利用法度榜样的设计者平日期望将实体标识的自动天生委托给数据库的这种特点,OpenJPA 框架中的实体标识能够满意利用法度榜样设计者的要求,应用数据库的自增长字段为实体自动天生标识。

要将实体标识的自动天生委托给数据库的自增长字段特点,必要数据库和实体定义的双方共同才能够达到:首先,必须将实体标识字段对应的数据库列改动为自动增长列,别的还必要将实体类中实体标识字段的 GeneratedValue 注释的 stragety 属性的值设置为 GenerationType.IDENTITY。

我们以 Animal 实体在 HSQL 数据库中的持久化来阐明若何应用自增长字段自动天生实体标识所必要采取的步骤:

首先,我们应用下面的 SQL 语句创建 Animal 表,把它的 ID 字段设置为自动增长类型:

清单 4. 将 ID 字段设置为自动增长类型的 SQL 语句

CREATE TEXT TABLE ANIMAL (

ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,

NAME VARCHAR(255) NOT NULL

)

在数据库部分将表的主键字段设置为自动增长字段后,在实体 Animal 的定义中,我们必要将 id 字段 GeneratedValue 注释的 stragety 属性的值设置为 GenerationType.IDENTITY。Animal 实体类改动后的代码片段如下。

清单 5. 标识由自增长字段天生的 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.IDENTITY)

10. private long id;

11. private String name;

12.

13.  …

14.

15. }

序列号(Sequence)

序列号是 Oracle、PostgreSQL 等数据库供给的一种特点,用于为数据库的记录供给自动增长的编号,应用 Oracle、PostgreSQL 等数据库利用法度榜样的设计者平日期望将实体标识的自动天生委托给数据库的这种特点,OpenJPA 框架中的实体标识能够满意利用法度榜样设计者的要求,应用数据库的序列号为实体自动天生标识。

要将实体标识的自动天生委托给数据库的序列号特点,必要数据库和实体定义的双方共同才能够达到:首先,必须在数据库中创建相宜的序列号,别的还必要为实体标识字段供给 SequenceGenerator 注释,设置它的参数,为实体类供给关于序列号的信息,同时将实体类中实体标识字段的 GeneratedValue 注释的 stragety 属性的值设置为 GenerationType.SEQUENCE,将 generator 属性的值设置为 SequenceGenerator 注释的 name 属性的值。

我们以 Animal 实体在 Oracle 数据库中的持久化来阐明若何应用自增长字段自动天生实体标识所必要采取的步骤:

首先,在 Oracle 数据库中运行下面的 SQL 语句创建名为 HelloWorldSequence 的序列号,序列号支持 cache,大年夜小为 50:

清单 6. 创建序列号的 SQL 语句

CREATE SEQUENCE HELLOWORLDSEQUENCE

START WITH 0

INCREMENT BY 1

MINVALUE 1

CACHE 50

NOCYCLE

NOORDER

然后,在 Oracle 数据库中,我们应用下面的 SQL 语句创建 ANIMAL 表:

清单 7. 创建 ANIMAL 表

CREATE TABLE EOS52.ANIMAL

(

ID CHAR(10),

NAME VARCHAR2(100) NOT NULL,

CONSTRAINT PK_ANIMAL PRIMARY KEY (ID )

)

在数据库部分创建相宜的序列号和响应的数据库表后,在实体 Animal 的定义中,我们必要将 id 字段 GeneratedValue 注释的 stragety 属性的值设置为 GenerationType.SEQUENCE,设置它的 generator 属性的值为 SeqGenerator。我们还必要为 id 字段供给别的一个相关的注释 SequenceGenerator,设置它的 name 属性为 SeqGenerator,设置它 sequenceName 属性为 HelloWorldSequence。Animal 实体类改动后的代码片段如下。

清单 8. 标识由序列号天生的 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.SEQUENCE, generator = "SeqGenerator")

|-------10--------20--------30--------40--------50--------60--------70--------80--------9|

|-------- XML error: The previous line is longer than the max of 90 characters ---------|

10. @SequenceGenerator(name = "SeqGenerator", sequenceName = " HelloWorldSequence")

11. private long id;

12. private String name;

13.

14.  …

15.

16. }

数据库表

除了应用容器天生的实体标识,或者借助于数据库的自增长字段或者序列号等要领天生实体标识之外,我们还可以选择借助数据库表来自动天生实体标识。道理是我们供给一个自力的数据库表,该表的主键列 ( 假设列名 ID) 记录实体编号的特性字符串 ( 假设存在一笔记录的 ID 为 customID),别的一列 ( 假设列名为 SEQUENCE_VALUE) 记录该特性字符串对应实体标识的最大年夜值。编写实体代码时,我们指定实体标识由数据库表中指定的特性字符串 ( 如 customID) 对应的列 SEQUENCE_VALUE 处置惩罚,当有新的实体被持久化时,容器将获取行 customID、列 SEQUENCE_VALUE 对应的数值 +1 后作为新实体的标识,同时将该列的值也自动 +1。

要将实体标识的自动天生委托给数据库表,必要数据库和实体定义的双方共同才能够达到:首先,必须在数据库中创建相宜的保存实体标识的表,别的还必要为实体标识字段供给 TableGenerator 注释,设置它的参数,为实体类供给关于数据库表、字段的信息,同时将实体类中实体标识字段的 GeneratedValue 注释的 stragety 属性的值设置为 GenerationType.Table,将 generator 属性的值设置为 SequenceGenerator 注释的 name 属性的值。

我们以 Animal 实体类来阐明应用数据库表自动天生实体标识所必要采取的步骤:我们假设存在这样的场景,Animal 实体的标识由利用法度榜样中自定义的数据库表 MY_KEYS 自动天生,MY_KEYS 表中有两列,一列是 KEYID,它保存实体标识的特性值,一列是 KEYVALUE,它保存实体当前的最大年夜编号,除此之外,我们还抉择应用 ANIMALID 作为 Animal 实体标识的特性字符串。

首先,在数据库中应用下面的 SQL 语句创建名为 MY_KEYS 的数据库表。在 OpenJPA 容器中,假如我们没有创建 MY_KEYS 表,OpenJPA 容器将帮我们自动天生对应的表布局。

清单 9. 创建数据库表 MY_KEYS

CREATE TABLE MY_KEYS (

KEYID VARCHAR(255) NOT NULL,

KEYVALUE BIGINT,

PRIMARY KEY (KEYID)

)

在数据库部分创建相宜的数据库表后,在实体 Animal 的定义中,我们必要将 id 字段 GeneratedValue 注释的 stragety 属性的值设置为 GenerationType.TABLE,设置它的 generator 属性的值为 TableGenerator。我们还必要为 id 字段供给别的一个注释 TableGenerator,设置它的 name 属性为 TableGenerator,设置它的 table 属性为 MYKEYS、pkColumnName 属性为 KEYID、valueColumnName 属性为 KEYVALUE、 ANIMALID 属性为 ANIMALID。Animal 实体类改动后的代码片段如下。

清单 10. 标识由数据库表天生的 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.TABLE, generator = " TableGenerator ")

|-------10--------20--------30--------40--------50--------60--------70--------80--------9|

|-------- XML error: The previous line is longer than the max of 90 characters ---------|

10. @TableGenerator(name = " TableGenerator", table = "MY_KEYS",

pkColumnName = "KEYID", valueColumnName = "KEYVALUE", pkColumnValue = "ANIMALID")

|-------10--------20--------30--------40--------50--------60--------70--------80--------9|

|-------- XML error: The previous line is longer than the max of 90 characters ---------|

11. private long id;

12. private String name;

13.

14.  …

15.

16. }

调用代码

上面的章节中我们进修了分手应用四种要领来自动天生实体的标识,因为这四种环境下,Animal 实体的标识都由 OpenJPA 和数据库协作后自动天生,对付开拓者而言,这个历程是透明的,是以我们可以应用相同的要领来创建这些实体:创建新的 Animal 实例的时刻不再必要为主键字段供给属性值,只必要设置 Animal 实例的非标识字段 name 的值即可。下面的代码演示了 Animal 实例的持久化代码,请留意代码中并没有调用 Animal 实例的 setId 措施。

清单 11. Animal 实例的持久化代码

1. EntityManagerFactory factory = Persistence.

2.     createEntityManagerFactory(

3.     "jpa-unit", System.getProperties());

4. EntityManager em = factory.createEntityManager();

5. em.getTransaction().begin();

6.

7. Animal animal = new Animal();

8. // 此处不必要调用 animal 的 setId 措施

9. animal.setName("ba guai!");

10. em.persist(animal);

11.

12. em.getTransaction().commit();

13. em.close();

14. em2.close();

15. factory.close();

总结

本文先容了开拓者应用 OpenJPA 实现实体标识自动天生时可选择应用的注释,并且结合简单的例子,分手先容了 OpenJPA 中实现容器治理的实体标识自动天生、结合数据库自增长字段、序列号、数据库表等特点实现实体标识自动天生时注释的详细用法和操作步骤。

您可能还会对下面的文章感兴趣: