总结一下关于JPA的主键生成策略,JPA是用@GeneratedValue标记来注释的。一般的我把主键生成分成两大类。第一个就是简单的单字段主键类型,一个就是复杂的复合主键类型。我们分2种情况分别讨论。
第一种单字段主键类型,看上去简单,无非就是一个id字段呗,实际上这个主键字段在JPA,还有任何的ORM框架中都是有很多种生成策略的。
一般是如下4种:
1. AUTO:自动自增生成
2. TABLE:自定义表生成器
3. Identity:像MS SQL支持Identity字段的生成主键策略
4. Sequence:像Oracle支持Sequence的生成主键策略
1:自动生成主键AUTO
AUTO是默认的主键生成策略,使用了AUTO策略,JPA会根据不同的数据库类型来实现自增策略。比如MySql的表主键是自增1的,那么此策略就会按照数据库的自增1策略,每次插入数据库记录的时候都会自增1。Java代码片段如下:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
|
2:自定义表生成器TABLE
自定义表生成器是在数据库中再建立一张新的表,这张表不是业务表,而是一张特殊表,这张表是专门用来管理整个数据库的主键的具体值的。在数据库中建立一张表如下图所示:
那么相应的Java片段如下所示:
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "myTablePK")
@TableGenerator(
name = "myTablePK",
table = "tb_pk",
pkColumnName = "table_PK_name",
pkColumnValue = "tb_contact_pk",
valueColumnName = "table_PK_value",
allocationSize = 1)
private Integer id;
|
下面对@TableGenerator标记的属性说明一下:
Name:引用@GeneratedValue里面的generator的值
Table:数据库中专门用于生成主键的特殊表的表名
pkColumnName:tb_pk表中哪个字段代表了被服务(需要生成主键表)的表名
valueColumnName:指定此辅助表的哪个字段存储了主键的具体值
pkColumnValue:指明一个主键名称,依靠这个名称可以在这张特殊表中找到唯一的table_PK_value的值,而这个值就是具体的主键值。换句话说,数据库有几个业务表,这张表就应该有几条记录才对(除去复合主键的情况)
allocationSize:代表自增数
下面自己再写一个测试方法,这次注释掉主键set那一句,代码如下:
/**
* 保存ContactEO实体单元测试
*
* @throws NamingException
*/
public void test03() throws NamingException {
// 建立实体
ContactEO contactEO = new ContactEO();
//注释掉主键这句话
//contactEO.setId(2);
contactEO.setName("测试主键table策略");
contactEO.setMessage("表策略");
contactEO.setEmail("suhuanzheng77848@163.com");
contactEO.setPrice(9999999911.12);
// 对byte属性的赋值
try {
// 读取本机一个文件
File file = new File("c://22.jpg");
if (file != null) {
FileInputStream fis = new FileInputStream(file);
if (fis != null) {
int len = fis.available();
byte[] xml = new byte[len];
fis.read(xml);
// 赋值
contactEO.setPicture(xml);
}
}
} catch (Exception e) {
e.printStackTrace();
}
// 获得应用服务上下文
Context ctx = getInitialContext();
Object object = ctx.lookup("ContactServiceImpl/remote");
// 接口
IContactService contactService = (IContactService) PortableRemoteObject
.narrow(object, IContactService.class);
// 调用接口保存方法
contactService.saveContact(contactEO);
}
|
执行后,数据库记录如下:
tb_contact记录
可以看到id=4的是tb_pk表辅助生成的值。
tb_pk表记录如下
可以看到,tb_pk这张表的table_PK_value的值改变了。
- 大小: 54.7 KB
- 大小: 95.5 KB
- 大小: 55.5 KB
分享到:
相关推荐
### JPA主键生成策略详解 #### 一、概述 持久化对象的主键生成机制在JPA(Java Persistence API)中占据着重要的位置。它不仅关乎数据的唯一标识符如何确定,还与数据的存储效率及应用逻辑紧密相关。JPA通过`@...
在EJB(Enterprise JavaBeans)框架中,JPA被广泛使用,提供了一种面向对象的方式来处理数据库交互。本篇笔记主要聚焦于JPA的关联映射,这是JPA中一个重要的概念,用于定义实体之间的关系。 关联映射允许我们将...
### JPA学习笔记-EJB-02JPA属性注解 #### 一、引言 在上一篇文章中,我们简要介绍了Java Persistence API (JPA)的基础知识,包括它的基本部署和操作流程,从而让我们对JPA有了初步的认识。本文将继续深入探讨JPA的...
### JPA实体对象状态 #### 一、实体对象的状态分类 在Java Persistence API (JPA) 中,实体对象的状态管理是实现数据持久化的基础之一。根据实体对象与实体管理器(EntityManager)之间的交互关系,实体对象可以...
### JavaEE5学习笔记05-EJB之会话Bean总结 #### EJB(Enterprise JavaBeans)简介 EJB(Enterprise JavaBeans)是Java EE平台的一部分,用于开发和部署可重用的服务组件。EJB规范定义了如何编写、部署以及管理企业...
### JPA学习文档知识点概述 #### 1. JPA简介 - **定义**: JPA (Java Persistence API) 是由Sun官方提出的一种Java持久化规范,旨在简化Java应用程序中关系型数据库的操作过程。其核心目标是统一现有的ORM (Object-...
### JPA 学习笔记详解 #### 一、JPA 概述 Java Persistence API (JPA) 是 Sun 公司提出的一种 Java 持久层标准,它为 Java 开发者提供了一种对象关系映射 (ORM) 的工具来管理 Java 应用程序中的关系型数据。JPA ...
总结来说,本文档涵盖了Spring JPA的基础配置和使用方法,包括所需的依赖库、持久化配置文件`persistence.xml`的编写、实体类的定义以及实体间关系的映射。通过这些知识点的学习,可以更好地理解和掌握Spring JPA的...
### EJB学习笔记4:深入理解实体与JPA #### 实体的概念与作用 实体,在企业级Java开发中,特别是EJB(Enterprise JavaBeans)框架下,指的是具有持久化能力的POJO(Plain Old Java Object)类。不同于实体Bean...
在深入探讨《ejb学习笔记》这一主题之前,我们首先需要理解什么是EJB(Enterprise JavaBeans)。EJB是Java平台为企业级应用开发提供的一套组件模型,它属于J2EE(Java 2 Platform, Enterprise Edition)的一部分,...
EJB 3.0 版本引入了许多改进,简化了API,降低了学习曲线,使其更易于使用。 在MVC(模型-视图-控制器)架构中,EJB 主要用于开发业务层。它负责处理数据和业务逻辑,而视图层则展示数据,控制器则协调视图和模型...
**EJB3.0 学习笔记** EJB(Enterprise JavaBeans)是Java EE平台中的核心组件,用于构建可扩展的、安全的、事务处理的分布式应用程序。EJB3.0是EJB的一个重大更新,引入了许多改进,使得开发过程更为简化,降低了...
- `@GeneratedValue`: 控制主键生成策略,如自动递增或UUID生成。 3. **会话Bean(Session Beans)**: - `@Stateless`: 无状态会话Bean,适用于不保存客户端上下文的情况,服务器可以自由地复用和销毁实例。 - ...
【EJB学习笔记】 EJB,全称为Enterprise Java Beans,是Java平台上的一个标准,用于开发和部署服务器端的分布式组件。它基于Java语言,为创建高效能、安全且可扩展的企业级应用提供了框架。EJB规范由Java ...
从最初的EJB 1.0到EJB 2.x,再到EJB 3.0,其复杂性和学习曲线逐渐降低。EJB 3.0引入了注解,极大地简化了代码,并且与JPA、JSF等其他Java EE技术更好地集成。最新的EJB 3.2版本继续优化了API,提高了开发效率。 **...