ID Generator
A lot of us (until recently myself included) tend to use Sequence
generators to generate PKs. These are well known to anybody who used
Oracle or any other RDBMS. Sequences, however tend to have a number of
issues:
- They require an extra database object for each ID. Those need
to be part of DDL, and are yet another moving part when deploying code
changes. How many of us deployed new code, only to find out we forgot
to create corresponding sequences.
- If you ever
plan on exposing your objects outside (like
datawarehouse for example) the sequences need to be staggered across
all your partitions and regions. This is a manual, error prone process.
Instead consider using a UUID
generator with a time prefix to create a 29 char unique id. You will need to create a custom UUID generator:
import java.nio.ByteBuffer;
import java.util.UUID;
import org.apache.commons.codec.binary.Base64;
import org.hibernate.engine.SessionImplementor;
import org.hibernate.id.IdentifierGenerator;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
/**
* Generates a UUID used for a hibernate ID.
*/
public class UUIDGenerator implements IdentifierGenerator {
/**
* Returns a Base64-encoded UUID with a time prefix. The Base64 encoding is
* there to shorten the length of the ID (without losing any information in
* the process).
*/
@Override
public String generate(SessionImplementor session, Object object) {
// Create a new byte buffer packed with the 128-bits from a randomly
// generated UUID
UUID uuid = java.util.UUID.randomUUID();
ByteBuffer bb = ByteBuffer.allocate(16)
.putLong(uuid.getMostSignificantBits()) // First 8 bytes
.putLong(uuid.getLeastSignificantBits()); // Last 8 bytes
// Base-64 encode the UUID, remove the trailing '='
String base64 = new String(Base64.encodeBase64(bb.array())).substring(0, 22);
// Prepend date + hour to the application to optimize block caching on
// Oracle side
// See Grant McAlister's POA presentation for the reasons behind that
String prefix = new DateTime(DateTimeZone.UTC).toString(DateTimeFormat.forPattern("yyyyDDD"));
// Done
return prefix + base64;
}
}
Next, all you need is to declare this UUID generator on your PKs:
@Entity
@Table(name = "MY_ENTITY")
@org.hibernate.annotations.GenericGenerator(name = "uuid-generator", strategy = "UUIDGenerator")
public class Entity {
@Id
@Column(name = "ID", length = 29)
@GeneratedValue(generator = "uuid-generator")
private String id;
}
(RECOMMENDED
) See
Grant McAlister's January 2010 PoA GEMs talk on UUIDs to learn about
how to prefix GUIDs/UUIDs with time information to drastically minimize
impact on your databases during writes for high insert rate
applications.
Other topics:
A Quick Guide
: http://betterexplained.com/articles/the-quick-guide-to-guids/
分享到:
相关推荐
例如,创建一个名为"Employees"的新表: ```cpp cmd->CommandText = "CREATE TABLE Employees (ID AUTOINCREMENT PRIMARY KEY, Name VARCHAR(50), Position VARCHAR(50))"; cmd->Execute(NULL, NULL, adCmdText); ``...
**server-id** 是 MySQL 实例的一个唯一标识符,用于区分主从节点。当搭建主从复制环境时,每个实例的 `server-id` 必须是唯一的,且数值不能为0,因为0会阻止从库的连接。默认情况下,MySQL 的 `server-id` 值为0,...
# 返回匹配的db.models.S3Image.uuid给image_uuid; image_uuid = ec2utils.id_to_glance_id(context, image['id']) # 获取镜像image的状态; if image: image_status = image['status'] ``` ##### 2. 方法...
这是一个用wabacus3.4制作的小例子(本地环境wabacus3.4+tomcat7+jdk1.7+oracle10g), 是用来让部门成员填写周报的, 内容包括了登录,填写周报,查看报告,权限管理,保存用户个性化信息(主题,列排序,列拖动,列选择)等等 ...
这是一个PostgreSQL的开源扩展,提供了生成UUID的函数,如`uuid_generate_v1()`, `uuid_generate_v3()`, `uuid_generate_v4()`和`uuid_generate_v5()`。其中,`uuid_generate_v4()`是最常用的,它基于随机数生成UUID...
# 创建一个 session session_data = "User ID: 12345" session_id = create_session(session_data) print(f"Created session with ID: {session_id}") # 获取 session 数据 retrieved_data = get_session...
总的来说,`javabean(DB)`指的是一个与数据库操作相关的JavaBean组件,它可能包含一系列用于数据库交互的方法和属性,是Java应用中数据持久化和业务处理的关键部分。在实际项目中,我们需要根据具体需求来设计和使用...
临床_tcga 用于从 TCGA 解析元... 如果还包括一个 UUID 到条形码 ID 的转换工具。 单个 UUID 可以这样转换: convert_tcga_uuid.rb sample_uuid或者多个 UUID 在作为文件提供时可以一次转换: convert_tcga_uuid.rb -f
在本案例中,"VCDB.rar_vc和vcdb"是一个与VC++相关的压缩包,包含了用于通过OLEDB访问数据库的封装类。OLEDB是微软提出的一种数据访问接口,它允许开发者直接访问多种类型的数据源,如SQL Server、Access、Excel等,...
MySQL全局ID生成方法是数据库设计中的一个重要议题,特别是在大规模分布式系统中,确保ID的全局唯一性和高并发下的高效生成是数据库架构的关键要素。以下是一些常见的全局ID生成策略: 1. **基于CAS(Check and Set...
rateable:install$ rake db:migrate如果您使用 UUIDS: $ rails generate is_rateable:install --id_column_type uuid$ rake db:migrate这可以确保您的参考rater和ratee采用的是:uuid列,而不是一个:integer一个配置...
值得注意的是,Django 默认情况下,如果模型没有显式声明主键,它会自动添加一个名为 `id` 的 `AutoField` 作为主键,这会在数据库中创建一个自动递增的整数字段。例如: ```python class Student(models.Model): ...
首先,需要创建一个`Connection`对象,然后使用`Open`方法打开数据库。代码示例如下: ```cpp BOOL CMy123App::InitInstance() { AfxEnableControlContainer(); CoInitialize(NULL); // ... _ConnectionPtr m_...
在用户界面中创建并设置实验后,您可以通过从路由API(/ api / v1 / experiments / route)接收每个用户ID(如有必要,为uuid)的分配来自由地执行AB测试。 入门 安装 您可以使用pip快速安装它,如下所示。 pip ...
这将创建一个名为TestTable的新表,包含一个自动递增的主键字段ID和一个VARCHAR类型的Name字段。 至于_RecordsetPtr,你可以使用它来填充数据或执行查询: ```cpp _RecordsetPtr m_pRecordset = NULL; m_...
在服务器上解压GI和oracle软件的zip 包 [root@dbrac1 opt]# unzip ...看此命令是否能获取到磁盘的UUID值,正常情况是能获取到的,如果没有获取到,请查检12cdbrac1.vmx文件中是否添加了这一项disk.EnableUUID = "TRUE
MFC(Microsoft Foundation Classes)是微软为简化Windows应用程序开发而提供的一个类库,它封装了Windows API的复杂性,使开发者能够更高效地创建具有丰富图形用户界面的应用程序。 ### SQL Server 2008 SQL ...
总结,通过Flask和Python,我们可以快速构建一个数字商品支付系统,实现用户友好的购买流程、安全的支付处理、自动化的邮件发送以及数据库驱动的下载管理。尽管这里展示的代码简化了许多细节,但它展示了如何利用...
在这个实验“lab_azure_build-cassandra-app-with-python-sdk-azure-cosmos-db”中,我们将探讨如何使用Python SDK与Azure Cosmos DB的Cassandra API来构建一个应用程序。Azure Cosmos DB是微软提供的一款全球分布式...