原文: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注解来把主键策略设置为AUTO、IDENTITY、SEQUENCE或者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,如果像前面的例子那样实现了equals和hashCode方法的话,你还可以把这作为额外的收获添加进来。
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")
分享到:
相关推荐
这个测试案例将创建一个新的`DemoEntity`实例并保存到数据库,然后检查是否成功生成并保存了UUID主键。 ### 7. 总结 通过以上步骤,你已经学会了如何在Hibernate中使用UUID作为主键。这种方式不仅提供了全局唯一性...
在JPA中,我们可以使用`@IdClass`或`@EmbeddedId`注解来实现联合主键。 1. **@IdClass注解**:当你需要创建一个单独的类来表示联合主键时,可以使用@IdClass。例如,假设我们有一个`Student`实体和一个`Course`实体...
4. **UUID**:生成全局唯一的UUID字符串作为主键。 5. **ASSIGNED**:主键由应用程序分配,JPA不会自动管理。 选择哪种策略取决于你的数据库系统和需求。例如,如果你的数据库不支持序列,但又希望有顺序的主键,...
5. **GenerationType.UUID**: 生成全局唯一的UUID字符串作为主键,适用于分布式系统。 6. **GenerationType.INCREMENT**: 在内存中自增,不依赖数据库,但并发性能较差。 7. **GenerationType.NATIVE**: 自动选择...
在关系型数据库中,单个字段作为主键的情况较为常见,但在某些场景下,我们需要使用多个字段共同作为主键来唯一标识表中的每一条记录,这就是所谓的“联合主键”。而在Java持久化框架(Java Persistence API,简称...
为了实现分页查询,可以使用`Pageable`接口作为方法参数,Spring Data JPA会自动处理分页逻辑。例如: ```java public interface UserService extends JpaRepository, Long> { Page<User> findAll(Pageable ...
1. **使用`@IdClass`注解**:你可以定义一个类作为联合主键的载体,这个类包含所有组成主键的属性,并且每个属性都标记为`@Id`。然后在实体类上使用`@IdClass`注解,指定这个联合主键类。 ```java public class ...
5. **UUID**:生成全局唯一的UUID字符串作为主键。 6. **ASSIGNED**:主键由应用程序负责生成,JPA不参与。 在JPA中,可以通过`@GeneratedValue`注解指定主键生成策略,如`@GeneratedValue(strategy = ...
Spring Boot 作为一个流行的 Java 框架,提供了一个快速开发的平台,集成了 Spring Data JPA 可以让开发者快速上手 JPA,並實現快速开发。 Spring Boot 集成 Spring Data JPA 要在 Spring Boot 项目中集成 Spring...
【标题】"notes_JPA_JSF:使用JSF和JPA实施来重建Notes项目"涉及的是在Java开发环境中,利用JavaServer Faces (JSF) 和 Java Persistence API (JPA) 技术重构建一个名为Notes的项目。JSF是Java EE平台上的一个用户...
本篇文章将深入探讨JPA中的联合主键概念、实现方式以及其在实际应用中的使用场景。 ### JPA 基本概念 JPA 是一种Java规范,它提供了一种标准的方式来管理和持久化Java对象到关系数据库。通过使用JPA,开发者可以...
在使用这个策略时,JPA会将主键的生成工作交由数据库完成,hibernate 不会介入。这意味着,数据库将负责生成主键,而不是hibernate。这种策略适用于大多数情况,因为它可以确保主键的唯一性和连续性。 uuid uuid是...
在本篇文章中,我们将深入探讨JPA中的联合主键实现,以及如何在实际项目中使用它。 首先,让我们理解联合主键的基本概念。在关系数据库中,主键是用来唯一标识表中每一行记录的字段或字段组合。在JPA中,我们可以...
Spring Data JPA 是一个强大的框架,它简化了Java应用程序中对关系数据库的访问。在Spring Boot项目中,Spring Data JPA 提供了便捷的方式来进行数据持久化操作,减少了大量重复的DAO层代码。本篇文章主要关注Spring...
一共有三个分卷。全部下载才能解压。 这本书不错,值得一看。
在本项目"springmvc-jpa-postgres"中,我们探讨了如何使用Hibernate作为JPA(Java Persistence API)的实现,并结合PostgreSQL数据库来构建Spring MVC应用程序的持久层。这是一个简化版的"springmvc-jpa"存储库,专...
通过"File -> Project Structure -> Modules -> JPA"的路径设置JPA支持,选择Hibernate作为默认提供者。然后,在Persistence窗口中,可以右键选择"Generate Persistence Mapping -> By Database Schema",选择数据库...
1:JPA: : 2:对象数据库: ://www.objectdb.com/ 3:JPA 性能基准: ://www.jpab.org/All/All/All.html 支持功能 支持所有蓝图功能, 除外 支撑 支持 支持 Java 5、6 或 7 支持 JPA 你需要哪一个取决于你想用...
本文主要探讨了在使用Java Persistence API (JPA) 和 Hibernate 框架时,如何处理主键的生成,特别是针对不同数据库系统的序列(sequence)机制。 首先,序列是一种在数据库中用于生成有序整数的机制,常被用作主键...
使用JPA访问数据: : 。 使用REST访问JPA数据: : 。项目中的Bean全部采用进行精简,需要配合IDE插件使用,在此项目不进行讨论,如需了解更多,参考以下链接:官方文档地址: : 。官方下载地址: : 。 lombok-...