[译文]JPA的实施模式:使用UUID作为主键
来源:互联网 发布:1万淘宝买家数据购买 编辑:程序博客网 时间:2024/04/29 09:44
原文: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")
- [译文]JPA的实施模式:使用UUID作为主键
- [译文]JPA的实施模式:双向关联
- [译文]JPA的实施模式:检索实体
- [译文]JPA的实施模式:删除实体
- [译文]JPA的实施模式:延迟加载
- [译文]JPA的实施模式:测试
- [译文]JPA的实施模式:保存(游离的)实体
- [译文]JPA的实施模式:映射继承的层次体系
- [译文]JPA的实施模式:数据访问对象
- [译文]JPA的实施模式:服务门面和数据传输对象
- LitePal使用UUID作为主键
- JPA使用Hibernate实现,使用UUID.主键的生成策略.
- JPA Hibernate 使用UUID做为主键的问题
- [译文]JPA的实施模式:双向关联与延迟加载之间的矛盾
- [译文]JPA的实施模式:域访问和属性访问之间的比较
- 生成UUID作为主键
- Jpa主键UUID生成策略
- 在Activiti中使用UUID作为主键生成策略
- 如何求一个int型数的绝对值?
- FORM中使用onSubmit="return false"防止表单自动提交
- [学习笔记の工具集合]Microsoft Silverlight开发工具及下载地址(及时更新中…...)
- c#.net使用oledb读取excel
- [学习笔记のSilverlight2]Silverlight2跨域问题
- [译文]JPA的实施模式:使用UUID作为主键
- [面试笔记のT-SQL] 与关键字“like”配合使用的通配符
- [面试笔记の复习].NET 新手小组的每日一题
- Google Code Jam 2009预选赛第三题----Welcome to Code Jam
- 控制台程序Ctrl +C 退出
- Linux平台超级好用服务器远程管理工具webmin的安裝
- 2009-07-03 TIPTOP
- 网络工程师走向培训后就业
- List转换成DataSet