📄 openjpa.htm
字号:
机制自动生成实体标识,我们必须将实体主键字段的 GeneratedValue 注释的 strategy 属性设置为
GenarationType.AUTO,然后将 GeneratedValue 注释的 generator 属性设置为
uuid-hex。以 Animal 实体类为例,我们只需要将 Animal 实体修改为如下内容: <BR><BR>清单 3.
使用 uuid-hex 机制自动生成实体标识 <BR><BR><BR>1. import
javax.persistence.Entity; <BR>2. import
javax.persistence.GeneratedValue; <BR>3. import
javax.persistence.GenerationType; <BR>4. import
javax.persistence.Id; <BR>5. <BR>6. @Entity <BR>7. public
class Animal { <BR>8. @Id <BR>9.
@GeneratedValue(strategy=GenerationType.AUTO, generator =
"uuid-hex") <BR>10. private String id; <BR>11. private String
name; <BR>12. <BR>13. … <BR>14. <BR>15. } <BR><BR><BR><SPAN
style="FONT-SIZE: 15px; LINE-HEIGHT: normal"><B>自增长字段</B></SPAN>
<BR><BR>自增长字段是 HSQL、SQL Server、MySQL、DB2、Derby
等数据库提供的一种特性,用于为数据库的记录提供自动增长的编号,应用程序的设计者通常期望将实体标识的自动生成委托给数据库的这种特性,OpenJPA
框架中的实体标识能够满足应用程序设计者的要求,使用数据库的自增长字段为实体自动生成标识。
<BR><BR>要将实体标识的自动生成委托给数据库的自增长字段特性,需要数据库和实体定义的双方配合才能够达到:首先,必须将实体标识字段对应的数据库列修改为自动增长列,另外还需要将实体类中实体标识字段的
GeneratedValue 注释的 stragety 属性的值设置为 GenerationType.IDENTITY。
<BR><BR>我们以 Animal 实体在 HSQL
数据库中的持久化来说明如何使用自增长字段自动生成实体标识所需要采取的步骤: <BR><BR>首先,我们使用下面的 SQL
语句创建 Animal 表,把它的 ID 字段设置为自动增长类型: <BR><BR>清单 4. 将 ID
字段设置为自动增长类型的 SQL 语句 <BR><BR><BR>CREATE TEXT TABLE ANIMAL (
<BR>ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0)
NOT NULL PRIMARY KEY, <BR>NAME VARCHAR(255) NOT NULL <BR>)
<BR><BR><BR>在数据库部分将表的主键字段设置为自动增长字段后,在实体 Animal 的定义中,我们需要将 id
字段 GeneratedValue 注释的 stragety 属性的值设置为
GenerationType.IDENTITY。Animal 实体类修改后的代码片段如下。 <BR><BR>清单 5.
标识由自增长字段生成的 Animal 实体类 <BR><BR><BR>1. import
javax.persistence.Entity; <BR>2. import
javax.persistence.GeneratedValue; <BR>3. import
javax.persistence.GenerationType; <BR>4. import
javax.persistence.Id; <BR>5. <BR>6. @Entity <BR>7. public
class Animal { <BR>8. @Id <BR>9.
@GeneratedValue(strategy=GenerationType.IDENTITY) <BR>10.
private long id; <BR>11. private String name; <BR>12. <BR>13.
… <BR>14. <BR>15. } <BR><BR><BR><SPAN
style="FONT-SIZE: 15px; LINE-HEIGHT: normal"><B>序列号(Sequence)</B></SPAN>
<BR><BR>序列号是 Oracle、PostgreSQL
等数据库提供的一种特性,用于为数据库的记录提供自动增长的编号,使用 Oracle、PostgreSQL
等数据库应用程序的设计者通常期望将实体标识的自动生成委托给数据库的这种特性,OpenJPA
框架中的实体标识能够满足应用程序设计者的要求,使用数据库的序列号为实体自动生成标识。
<BR><BR>要将实体标识的自动生成委托给数据库的序列号特性,需要数据库和实体定义的双方配合才能够达到:首先,必须在数据库中创建合适的序列号,另外还需要为实体标识字段提供
SequenceGenerator 注释,设置它的参数,为实体类提供关于序列号的信息,同时将实体类中实体标识字段的
GeneratedValue 注释的 stragety 属性的值设置为 GenerationType.SEQUENCE,将
generator 属性的值设置为 SequenceGenerator 注释的 name 属性的值。 <BR><BR>我们以
Animal 实体在 Oracle 数据库中的持久化来说明如何使用自增长字段自动生成实体标识所需要采取的步骤:
<BR><BR>首先,在 Oracle 数据库中运行下面的 SQL 语句创建名为 HelloWorldSequence
的序列号,序列号支持 cache,大小为 50: <BR><BR>清单 6. 创建序列号的 SQL 语句
<BR><BR><BR>CREATE SEQUENCE HELLOWORLDSEQUENCE <BR>START WITH
0 <BR>INCREMENT BY 1 <BR>MINVALUE 1 <BR>CACHE 50 <BR>NOCYCLE
<BR>NOORDER <BR><BR><BR>然后,在 Oracle 数据库中,我们使用下面的 SQL 语句创建
ANIMAL 表: <BR><BR>清单 7. 创建 ANIMAL 表 <BR><BR><BR>CREATE TABLE
EOS52.ANIMAL <BR>( <BR>ID CHAR(10), <BR>NAME VARCHAR2(100) NOT
NULL, <BR>CONSTRAINT PK_ANIMAL PRIMARY KEY (ID ) <BR>)
<BR><BR><BR>在数据库部分创建合适的序列号和相应的数据库表后,在实体 Animal 的定义中,我们需要将 id
字段 GeneratedValue 注释的 stragety 属性的值设置为
GenerationType.SEQUENCE,设置它的 generator 属性的值为
SeqGenerator。我们还需要为 id 字段提供另外一个相关的注释 SequenceGenerator,设置它的
name 属性为 SeqGenerator,设置它 sequenceName 属性为
HelloWorldSequence。Animal 实体类修改后的代码片段如下。 <BR><BR>清单 8.
标识由序列号生成的 Animal 实体类 <BR><BR><BR>1. import
javax.persistence.Entity; <BR>2. import
javax.persistence.GeneratedValue; <BR>3. import
javax.persistence.GenerationType; <BR>4. import
javax.persistence.Id; <BR>5. <BR>6. @Entity <BR>7. public
class Animal { <BR>8. @Id <BR>9. @GeneratedValue(strategy =
GenerationType.SEQUENCE, generator = "SeqGenerator") <BR>10.
@SequenceGenerator(name = "SeqGenerator", sequenceName = "
HelloWorldSequence") <BR>11. private long id; <BR>12. private
String name; <BR>13. <BR>14. … <BR>15. <BR>16. }
<BR><BR><BR><SPAN
style="FONT-SIZE: 15px; LINE-HEIGHT: normal"><B>数据库表</B></SPAN>
<BR><BR>除了使用容器生成的实体标识,或者借助于数据库的自增长字段或者序列号等方式生成实体标识之外,我们还可以选择借助数据库表来自动生成实体标识。原理是我们提供一个独立的数据库表,该表的主键列
( 假设列名 ID) 记录实体编号的特征字符串 ( 假设存在一条记录的 ID 为 customID),另外一列 (
假设列名为 SEQUENCE_VALUE)
记录该特征字符串对应实体标识的最大值。编写实体代码时,我们指定实体标识由数据库表中指定的特征字符串 ( 如
customID) 对应的列 SEQUENCE_VALUE 处理,当有新的实体被持久化时,容器将获取行 customID、列
SEQUENCE_VALUE 对应的数值 +1 后作为新实体的标识,同时将该列的值也自动 +1。
<BR><BR>要将实体标识的自动生成委托给数据库表,需要数据库和实体定义的双方配合才能够达到:首先,必须在数据库中创建合适的保存实体标识的表,另外还需要为实体标识字段提供
TableGenerator 注释,设置它的参数,为实体类提供关于数据库表、字段的信息,同时将实体类中实体标识字段的
GeneratedValue 注释的 stragety 属性的值设置为 GenerationType.Table,将
generator 属性的值设置为 SequenceGenerator 注释的 name 属性的值。 <BR><BR>我们以
Animal 实体类来说明使用数据库表自动生成实体标识所需要采取的步骤:我们假设存在这样的场景,Animal
实体的标识由应用程序中自定义的数据库表 MY_KEYS 自动生成,MY_KEYS 表中有两列,一列是
KEYID,它保存实体标识的特征值,一列是 KEYVALUE,它保存实体当前的最大编号,除此之外,我们还决定使用
ANIMALID 作为 Animal 实体标识的特征字符串。 <BR><BR>首先,在数据库中使用下面的 SQL
语句创建名为 MY_KEYS 的数据库表。在 OpenJPA 容器中,如果我们没有创建 MY_KEYS 表,OpenJPA
容器将帮我们自动生成对应的表结构。 <BR><BR>清单 9. 创建数据库表 MY_KEYS
<BR><BR><BR>CREATE TABLE MY_KEYS ( <BR>KEYID VARCHAR(255) NOT
NULL, <BR>KEYVALUE BIGINT, <BR>PRIMARY KEY (KEYID) <BR>)
<BR><BR><BR>在数据库部分创建合适的数据库表后,在实体 Animal 的定义中,我们需要将 id 字段
GeneratedValue 注释的 stragety 属性的值设置为 GenerationType.TABLE,设置它的
generator 属性的值为 TableGenerator。我们还需要为 id 字段提供另外一个注释
TableGenerator,设置它的 name 属性为 TableGenerator,设置它的 table 属性为
MYKEYS、pkColumnName 属性为 KEYID、valueColumnName 属性为 KEYVALUE、
ANIMALID 属性为 ANIMALID。Animal 实体类修改后的代码片段如下。 <BR><BR>清单 10.
标识由数据库表生成的 Animal 实体类 <BR><BR><BR>1. import
javax.persistence.Entity; <BR>2. import
javax.persistence.GeneratedValue; <BR>3. import
javax.persistence.GenerationType; <BR>4. import
javax.persistence.Id; <BR>5. <BR>6. @Entity <BR>7. public
class Animal { <BR>8. @Id <BR>9. @GeneratedValue(strategy =
GenerationType.TABLE, generator = " TableGenerator ") <BR>10.
@TableGenerator(name = " TableGenerator", table = "MY_KEYS",
<BR>pkColumnName = "KEYID", valueColumnName = "KEYVALUE",
pkColumnValue = "ANIMALID") <BR>11. private long id; <BR>12.
private String name; <BR>13. <BR>14. … <BR>15. <BR>16. }
<BR><BR><BR><SPAN
style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><B>调用代码</B></SPAN>
<BR><BR>上面的章节中我们学习了分别使用四种方式来自动生成实体的标识,由于这四种情况下,Animal 实体的标识都由
OpenJPA 和数据库协作后自动生成,对于开发者而言,这个过程是透明的,因此我们可以使用相同的方式来创建这些实体:创建新的
Animal 实例的时候不再需要为主键字段提供属性值,只需要设置 Animal 实例的非标识字段 name
的值即可。下面的代码演示了 Animal 实例的持久化代码,请注意代码中并没有调用 Animal 实例的 setId 方法。
<BR><BR>清单 11. Animal 实例的持久化代码 <BR><BR><BR>1.
EntityManagerFactory factory = Persistence. <BR>2.
createEntityManagerFactory( <BR>3. "jpa-unit",
System.getProperties()); <BR>4. EntityManager em =
factory.createEntityManager(); <BR>5.
em.getTransaction().begin(); <BR>6. <BR>7. Animal animal = new
Animal(); <BR>8. // 此处不需要调用 animal 的 setId 方法 <BR>9.
animal.setName("ba guai!"); <BR>10. em.persist(animal);
<BR>11. <BR>12. em.getTransaction().commit(); <BR>13.
em.close(); <BR>14. em2.close(); <BR>15. factory.close();
<BR><BR><SPAN
style="FONT-SIZE: 18px; LINE-HEIGHT: normal"><B>总结</B></SPAN>
<BR><BR>本文介绍了开发者使用 OpenJPA 实现实体标识自动生成时可选择使用的注释,并且结合简单的例子,分别介绍了
OpenJPA
中实现容器管理的实体标识自动生成、结合数据库自增长字段、序列号、数据库表等特性实现实体标识自动生成时注释的具体用法和操作步骤。</SPAN>
<!-- Attachments --></TD></TR>
<TR>
<TD class=spacerow colSpan=2 height=1><IMG height=1 alt=""
src="文章发表人是%20openjpa_files/spacer.gif" width=1></TD></TR>
<TR>
<TD class=postInfo colSpan=2>
<TABLE width="100%">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -