`
mondayw
  • 浏览: 143718 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

[译文]JPA的实施模式:使用UUID作为主键

阅读更多

原文:JPA implementation patterns: Using UUIDs as primary keys

作者:Albert Sikkema

出处:http://blog.xebia.com/2009/06/03/jpa-implementation-patterns-using-uuids-as-primary-keys/

 

作为Vincent Partington的关于JPA实施模式的博客序列的继续,我想补充以下内容。

 

JPA缺省的主键方式是使用带有strategy属性的@GenerateValue注解来把主键策略设置为AUTOIDENTITYSEQUENCE或者TABLE中的一个,你结合自己的具体情况来挑选最适合的策略,仅此而已。

不过也可以选择由你自己来生成主键。

使用UUID做主键是理想的,而且有一些很大的好处。在我们当前的项目中,我们通过创建一个抽象的基类来使用这一策略,其负责处理主键,我们的实体会继承这一基类。

 

@MappedSuperclass

public abstract class AbstractBaseEntity implements Serializable {

         private static final long serialVersionUID = 1L;

 

         @Id

         private String id;

 

         public AbstractBaseEntity() {

                  this.id = UUID.randomUUID().toString();

         }

 

         @Override

         public int hashCode() {

                  return id.hashCode();

         }

 

         @Override

         public boolean equals(Object obj) {

                  if (this == obj)

                            return true;

                  if (obj == null)

                            return false;

                  if (!(obj instanceof AbstractBaseEntity)) {

                            return false;

                  }

                  AbstractBaseEntity other = (AbstractBaseEntity) obj;

                  return getId().equals(other.getId());

         }

}

 

总的来说使用UUID和序列(sequence)的比较在网络上已经被广泛地讨论,因此在这里我不会说得过于详细,尽管如此,在这里还是给出一些优缺点:

 

优点

 

Ÿ           一旦编写了这样的一个基类之后,每个实体就都能够无偿地获得一个Id,如果像前面的例子那样实现了equalshashCode方法的话,你还可以把这作为额外的收获添加进来。

Ÿ           UUID是全球唯一(Universal Unique,这是UUID这一名称的含义)的,这意味着如果你需要无需重新生成键而拷贝/合并位置a到位置b的记录的话,那么你拥有着极大的灵活性。

Ÿ           UUID是不可推测的,这意味着把它们暴露到允许告知URL的那些地方是可以变得更加安全的,不过这是否是一种好的做法则属另一回事。

 

缺点

 

Ÿ           性能可能会是个问题,参见http://johannburkard.de/blog/programming/java/Java-UUID-generators-compared.html,一些数据库在使用UUID(至少在它们被存储成串时)进行索引时表现欠佳。

Ÿ           排序、分类,这方面不言自明。

Ÿ           JPA特有的:不能通过检查Id域是否被设定来测试记录是否已被持久。可能有人会质疑是否总是会需要这样的检查。

 

结论

 

UUID易于使用,不过,如果开放JPA规范,把UUID作为一种策略包括进来不是很好吗?有些JPA的实现,比如Hibernate,就已经支持了这样的做法:

 

@Id @GeneratedValue(generator="system-uuid")

@GenericGenerator(name="system-uuid",

  strategy = "uuid")

 

分享到:
评论

相关推荐

    Hibernate用UUID作为主键的Demo

    这个测试案例将创建一个新的`DemoEntity`实例并保存到数据库,然后检查是否成功生成并保存了UUID主键。 ### 7. 总结 通过以上步骤,你已经学会了如何在Hibernate中使用UUID作为主键。这种方式不仅提供了全局唯一性...

    15_传智播客JPA详解_JPA中的联合主键

    在JPA中,我们可以使用`@IdClass`或`@EmbeddedId`注解来实现联合主键。 1. **@IdClass注解**:当你需要创建一个单独的类来表示联合主键时,可以使用@IdClass。例如,假设我们有一个`Student`实体和一个`Course`实体...

    JPA环境搭建及JPA实例与JPA主键生成策略

    4. **UUID**:生成全局唯一的UUID字符串作为主键。 5. **ASSIGNED**:主键由应用程序分配,JPA不会自动管理。 选择哪种策略取决于你的数据库系统和需求。例如,如果你的数据库不支持序列,但又希望有顺序的主键,...

    04_JPA详解_第一个JPA实例与JPA主键生成策略.zip

    5. **GenerationType.UUID**: 生成全局唯一的UUID字符串作为主键,适用于分布式系统。 6. **GenerationType.INCREMENT**: 在内存中自增,不依赖数据库,但并发性能较差。 7. **GenerationType.NATIVE**: 自动选择...

    JPA注解实现联合主键

    在关系型数据库中,单个字段作为主键的情况较为常见,但在某些场景下,我们需要使用多个字段共同作为主键来唯一标识表中的每一条记录,这就是所谓的“联合主键”。而在Java持久化框架(Java Persistence API,简称...

    jpa入门案例:单表查询,包括分页查询 使用springboot来整合实现

    为了实现分页查询,可以使用`Pageable`接口作为方法参数,Spring Data JPA会自动处理分页逻辑。例如: ```java public interface UserService extends JpaRepository, Long> { Page<User> findAll(Pageable ...

    15_JPA详解_JPA中的联合主键.zip

    1. **使用`@IdClass`注解**:你可以定义一个类作为联合主键的载体,这个类包含所有组成主键的属性,并且每个属性都标记为`@Id`。然后在实体类上使用`@IdClass`注解,指定这个联合主键类。 ```java public class ...

    04_传智播客JPA详解_第一个JPA实例与JPA主键生成策略

    5. **UUID**:生成全局唯一的UUID字符串作为主键。 6. **ASSIGNED**:主键由应用程序负责生成,JPA不参与。 在JPA中,可以通过`@GeneratedValue`注解指定主键生成策略,如`@GeneratedValue(strategy = ...

    Spring Data JPA系列2:SpringBoot集成JPA详细教程,快速在项目中熟练使用JPA.doc

    Spring Boot 作为一个流行的 Java 框架,提供了一个快速开发的平台,集成了 Spring Data JPA 可以让开发者快速上手 JPA,並實現快速开发。 Spring Boot 集成 Spring Data JPA 要在 Spring Boot 项目中集成 Spring...

    notes_JPA_JSF:使用JSF和JPA实施来重建Notes项目

    【标题】"notes_JPA_JSF:使用JSF和JPA实施来重建Notes项目"涉及的是在Java开发环境中,利用JavaServer Faces (JSF) 和 Java Persistence API (JPA) 技术重构建一个名为Notes的项目。JSF是Java EE平台上的一个用户...

    JPA_5_联合主键

    本篇文章将深入探讨JPA中的联合主键概念、实现方式以及其在实际应用中的使用场景。 ### JPA 基本概念 JPA 是一种Java规范,它提供了一种标准的方式来管理和持久化Java对象到关系数据库。通过使用JPA,开发者可以...

    JPA主键策略(针对数据库自增字段重置后无效检查项)

    在使用这个策略时,JPA会将主键的生成工作交由数据库完成,hibernate 不会介入。这意味着,数据库将负责生成主键,而不是hibernate。这种策略适用于大多数情况,因为它可以确保主键的唯一性和连续性。 uuid uuid是...

    JPA中的联合主键

    在本篇文章中,我们将深入探讨JPA中的联合主键实现,以及如何在实际项目中使用它。 首先,让我们理解联合主键的基本概念。在关系数据库中,主键是用来唯一标识表中每一行记录的字段或字段组合。在JPA中,我们可以...

    Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍.doc

    Spring Data JPA 是一个强大的框架,它简化了Java应用程序中对关系数据库的访问。在Spring Boot项目中,Spring Data JPA 提供了便捷的方式来进行数据持久化操作,减少了大量重复的DAO层代码。本篇文章主要关注Spring...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1

    一共有三个分卷。全部下载才能解压。 这本书不错,值得一看。

    spring-jpa-oracle:演示将 CHAR 列持久化到 Oracle 数据库

    后来,尝试使用 Hibernate 或 JPA 等框架搜索具有相同值的列失败,因为搜索词没有填充到n ,导致搜索词与列中存储的值不匹配。 例如,考虑以下表定义: CREATE TABLE CITY ( ... NAME CHAR(40) NOT NULL ...);如果...

    springmvc-jpa-postgres:使用Hibernate作为JPA实现和Postgres数据库实现Spring MVC的持久性

    在本项目"springmvc-jpa-postgres"中,我们探讨了如何使用Hibernate作为JPA(Java Persistence API)的实现,并结合PostgreSQL数据库来构建Spring MVC应用程序的持久层。这是一个简化版的"springmvc-jpa"存储库,专...

    Spring Data JPA系列5:让IDEA自动帮你写JPA实体定义代码.doc

    通过"File -> Project Structure -> Modules -> JPA"的路径设置JPA支持,选择Hibernate作为默认提供者。然后,在Persistence窗口中,可以右键选择"Generate Persistence Mapping -> By Database Schema",选择数据库...

    blueprints-jpa-graph:蓝图 API 在 JPA 上的实现

    1:JPA: : 2:对象数据库: ://www.objectdb.com/ 3:JPA 性能基准: ://www.jpab.org/All/All/All.html 支持功能 支持所有蓝图功能, 除外 支撑 支持 支持 Java 5、6 或 7 支持 JPA 你需要哪一个取决于你想用...

    真实项目中关于主键生成方式的剖析(JPA)

    本文主要探讨了在使用Java Persistence API (JPA) 和 Hibernate 框架时,如何处理主键的生成,特别是针对不同数据库系统的序列(sequence)机制。 首先,序列是一种在数据库中用于生成有序整数的机制,常被用作主键...

Global site tag (gtag.js) - Google Analytics