使用@DynamoDBAutoGeneratedKey生成UUID时,DynamoDB含UUID的复合主键无法正确填充的问题求助
解决DynamoDB复合主键中自动生成UUID的问题
我之前也碰到过一模一样的情况,当时折腾了好一会儿才摸清楚问题根源。咱们先说说为什么你的代码会出现EXAMPLE#null的情况:
DynamoDBMapper的处理顺序是先读取实体类所有属性的当前值(包括调用getPK()获取主键),之后才会触发@DynamoDBAutoGeneratedKey注解的UUID生成逻辑。所以当getPK()被调用时,someUUID还没被赋值,自然就是null了。
下面给你两种可行的解决方案,你可以根据自己的需求选择:
方案一:把自动生成注解移到主键方法上
直接在getPK()上添加@DynamoDBAutoGeneratedKey,同时在setter方法里拆分出UUID部分,这样既能生成带前缀的主键,又能同步更新someUUID字段:
public class ExampleClass { private String someUUID; @DynamoDBHashKey(attributeName = "PK") @DynamoDBAutoGeneratedKey public String getPK() { return "EXAMPLE#" + someUUID; } public void setPK(String pk) { // 从主键中提取UUID,保证加载实体时someUUID能正确赋值 if (pk != null && pk.contains("#")) { this.someUUID = pk.split("#")[1]; } } @DynamoDBAttribute public String getSomeUUID() { return someUUID; } public void setSomeUUID(String someUUID) { this.someUUID = someUUID; } }
这个方案的核心是让DynamoDBMapper直接生成带前缀的主键,同时通过setter把UUID拆分出来存到someUUID里,不管是插入还是查询,两个字段都能保持一致。
方案二:用@DynamoDBBeforeSave提前生成UUID
如果不想改动主键的注解位置,可以用@DynamoDBBeforeSave注解在save操作前手动生成UUID,确保getPK()被调用时someUUID已经有值:
public class ExampleClass { @DynamoDBHashKey(attributeName = "PK") public String getPK() { return "EXAMPLE#" + someUUID; } public void setPK(String pk) { if (pk != null && pk.contains("#")) { this.someUUID = pk.split("#")[1]; } } @DynamoDBAttribute private String someUUID; @DynamoDBBeforeSave public void beforeSave() { // 只在UUID未生成时才生成,避免更新时覆盖 if (someUUID == null) { someUUID = UUID.randomUUID().toString(); } } }
@DynamoDBBeforeSave注解的方法会在DynamoDBMapper执行save操作前被调用,这时候生成UUID,后续读取主键时就能拿到正确的值了。
我个人更倾向第一种方案,因为逻辑更集中,不需要额外的前置方法,你可以根据自己的代码习惯来选。
内容的提问来源于stack exchange,提问作者LuxuryWaffles
相关产品推荐
相关产品推荐

