首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

JPA主键生成谋略

2012-06-29 
JPA主键生成策略JPA默认提供了四种主键生成策略。(1) GeneratorType.AUTO:容器自动生成(2) GenerationType.

JPA主键生成策略

JPA默认提供了四种主键生成策略。
(1) GeneratorType.AUTO:容器自动生成
(2) GenerationType.IDENTITY :使用数据库的自动增长字段生成,JPA容器将使用数据库的自增长字段为新增的

实体对象赋唯一值,这种情况下,需要数据库本身提供自增长字段属性,支持该属性的DB有:SQL Server、DB2、

MySQL、Derby等支持。

(3) GenerationType.SEQUENCE:使用数据库的序列号为新增加的实体对象赋唯一值, 这种情况下需要数据库提供

对序列号的支持常用的数据库中,Oracle支持。

(4) GenerationType.TABLE :使用数据库表的字段生成,表示使用数据库中指定表的某个字段记录实体对象的标识,

通过该字段的增长为新增加的实体对象赋唯一值

JPA是实现使用举例:
1. GeneratorType.AUTO

??? (1) OpenJPA

??? @Id
??? @GeneratedValue(strategy=GenerationType.AUTO, generator = "uuid")

??? (2) Hibernate:Eclipse会提示错误,但是程序是可以运行的

??? @Id
??? @GenericGenerator(name = "test", strategy = "uuid")
??? @GeneratedValue(generator = "test")

??? 说明:这中主键生成策略均跟实现有关系,不易于前移,推荐使用用:

??? java.util.UUID? user.setUserId(UUID.randomUUID().toString());

2. GenerationType.IDENTITY

??? @Id
??? @GeneratedValue(strategy = GenerationType.IDENTITY)
??? private long accountId;

??? 如果是在Derby数据库中,则需要定义字段

??? USER_ID? BIGINT? NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1);

??? 而在MySQL中不需要。

3. GenerationType.TABLE

??? (1) Hibernate: 需要创建生成主键的表

??? @TableGenerator(name = "testId", table = "IDTABLE",?
??????????????? pkColumnName = "KEYID", valueColumnName = "KEYVALUE", pkColumnValue =??

??? "TestUSER_ID")
??? @GeneratedValue(strategy=GenerationType.TABLE, generator="testId")

??? CREATE TABLE IDTABLE (
????????? KEYID VARCHAR(255) NOT NULL,?
????????? KEYVALUE BIGINT,?
????????? PRIMARY KEY (KEYID)
??? );

??? (2) JPA实现:数据库中没有该表将会自动生成

?

复合主键

?

热点排行