DynamoDBMapper:如何获取保存的项目?
DynamoDBMapper: How to get saved item?
对于一个简单的 Java REST-API 我创建了一个保存函数来将我的模型保存到 DynamoDB table。
模型使用自动生成的范围键,您可以在此处看到:
@DynamoDBTable(tableName = "Events")
public class EventModel {
private int country;
private String id;
// ...
@DynamoDBHashKey
public int getCountry() {
return country;
}
public void setCountry(int country) {
this.country = country;
}
@DynamoDBRangeKey
@DynamoDBAutoGeneratedKey
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
//...
}
不幸的是,DynamoDBMappers .save() method 没有 return 任何东西。我想 return 创建的项目在我的 201 HTTP 响应中设置正确的 location
header。
public EventModel create(EventModel event) {
mapper.save(event);
return null;
}
我怎样才能做到这一点?有什么建议么?当然我可以在客户端生成 id
但我不想这样做,因为解决潜在的原子性问题需要在客户端和 server-side.
上添加额外的逻辑
我正在使用版本 1.11.86
中的 aws-java-sdk-dynamodb
。
没关系,我想出了办法。 .save()
方法更新对象的引用。调用 mapper.save(event);
后,id
属性 被填充并具有其值。
所以让它工作的方法就是:
public EventModel create(EventModel event) {
mapper.save(event);
return event;
}
就是这样!
在 put/update 之后,可以通过 dynamo db mapper 直接获取保存在 dynamodb 中的内容 如果您使用 DynamoDBConfig 保存为 CLOBBER
或 [=11=,m4xy@ 提到的方法会起作用].如果您使用的是 UPDATE_SKIP_NULL_ATTRIBUTES
,此方法将不起作用。
如果您使用的是映射器,则必须再次专门调用 db 以获取现有值(如果有多个编写器,则可能已更新,您可能会得到意想不到的结果)。为确保读取符合您的预期,您可以为写入实现锁定,这样,如果给定线程获取了锁定,则其他线程无法为给定键写入。但是,这种方法的缺点是会减慢您的应用程序。
或者,您可以使用具有 api 的 dynamoDBClient 在写入后支持 return db 值。
https://sdk.amazonaws.com/java/api/2.0.0-preview-11/index.html?software/amazon/awssdk/services/dynamodb/DynamoDbClient.html
对于一个简单的 Java REST-API 我创建了一个保存函数来将我的模型保存到 DynamoDB table。
模型使用自动生成的范围键,您可以在此处看到:
@DynamoDBTable(tableName = "Events")
public class EventModel {
private int country;
private String id;
// ...
@DynamoDBHashKey
public int getCountry() {
return country;
}
public void setCountry(int country) {
this.country = country;
}
@DynamoDBRangeKey
@DynamoDBAutoGeneratedKey
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
//...
}
不幸的是,DynamoDBMappers .save() method 没有 return 任何东西。我想 return 创建的项目在我的 201 HTTP 响应中设置正确的 location
header。
public EventModel create(EventModel event) {
mapper.save(event);
return null;
}
我怎样才能做到这一点?有什么建议么?当然我可以在客户端生成 id
但我不想这样做,因为解决潜在的原子性问题需要在客户端和 server-side.
我正在使用版本 1.11.86
中的 aws-java-sdk-dynamodb
。
没关系,我想出了办法。 .save()
方法更新对象的引用。调用 mapper.save(event);
后,id
属性 被填充并具有其值。
所以让它工作的方法就是:
public EventModel create(EventModel event) {
mapper.save(event);
return event;
}
就是这样!
在 put/update 之后,可以通过 dynamo db mapper 直接获取保存在 dynamodb 中的内容 如果您使用 DynamoDBConfig 保存为 CLOBBER
或 [=11=,m4xy@ 提到的方法会起作用].如果您使用的是 UPDATE_SKIP_NULL_ATTRIBUTES
,此方法将不起作用。
如果您使用的是映射器,则必须再次专门调用 db 以获取现有值(如果有多个编写器,则可能已更新,您可能会得到意想不到的结果)。为确保读取符合您的预期,您可以为写入实现锁定,这样,如果给定线程获取了锁定,则其他线程无法为给定键写入。但是,这种方法的缺点是会减慢您的应用程序。
或者,您可以使用具有 api 的 dynamoDBClient 在写入后支持 return db 值。
https://sdk.amazonaws.com/java/api/2.0.0-preview-11/index.html?software/amazon/awssdk/services/dynamodb/DynamoDbClient.html