【问题标题】:DynamoDB Composite PK with UUID具有 UUID 的 DynamoDB 组合 PK
【发布时间】:2021-08-30 11:16:27
【问题描述】:

我在 DynamoDB 的 PK 中使用 UUID 时遇到问题

PK :EXAMPLE#{someUUID}

我正在使用 springboot 中的 @DynamoDBAutoGeneratedKey 注释生成 UUID,该注释在我的字段中生成 UUID,但在我的 PK 中不存在。

我的模型实现:

public class ExampleClass {
   
    @DynamoDBHashKey(attributeName = "PK")
    public String getPK() {
        return "EXAMPLE" + someUUID;
    }
    
    @DynamoDBAttribute
    @DynamoDBAutoGeneratedKey 
    private String someUUID;
}

当我使用 DynamoDBMapper.save 插入记录时,我的结果插入了具有所有属性的记录,但具有:

PK : EXAMPLE#null

在插入之前以编程方式创建 UUID 可以解决问题,但是我必须在每次插入之前手动生成 UUID,这并不理想。

有没有办法在使用 DynamoDBAutoGeneratedKey 时填充 getPK()?

【问题讨论】:

  • 您使用的是旧的 DynamoDB Java V1 代码。查看如何使用 Amazon DynamoDB Java V2 API 和增强型客户端。见docs.aws.amazon.com/sdk-for-java/latest/developer-guide/…
  • “必须在每次插入之前手动生成 UUID,这并不理想”——为什么生成 GUID 值的几行代码并不理想?

标签: java amazon-web-services spring-boot nosql amazon-dynamodb


【解决方案1】:

我对这种情况的暗示:

1º - 创建一个注释:

package io.github.wesleyosantos91.api.anotation;

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAutoGenerateStrategy;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAutoGenerated;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAutoGenerator;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.UUID;

@DynamoDBAutoGenerated(generator=CustomGeneratedKey.Generator.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface CustomGeneratedKey {
    String prefix() default "";

    public static class Generator implements DynamoDBAutoGenerator<String> {
        private final String prefix;
        public Generator(final Class<String> targetType, final CustomGeneratedKey annotation) {
            this.prefix = annotation.prefix();
        }
        public Generator() {
            this.prefix = "";
        }
        @Override
        public DynamoDBAutoGenerateStrategy getGenerateStrategy() {
            return DynamoDBAutoGenerateStrategy.CREATE;
        }
        @Override
        public final String generate(final String currentValue) {
            return prefix + UUID.randomUUID();
        }
    }
}

2º - 在属性中添加所需前缀的注释:

@DynamoDBHashKey
@CustomGeneratedKey(prefix="PERSON#")
private String id;

结果

PERSON#43bcad81-7bad-4c5f-ad55-dc26ced3c3ef

参考:https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBAutoGenerated.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多