DynamoDBMapper表生成仅创建索引。

6
我正在尝试使用Java API在DynamoDB中创建表格。
问题:它只会在表格中创建哈希键索引,而没有其他属性。
private void createTable(DynamoDBMapper mapper, AmazonDynamoDBClient amazonDynamoDBClient) {
    CreateTableRequest createTableRequest = mapper.generateCreateTableRequest(InsuranceData.class);
    createTableRequest.setProvisionedThroughput(new ProvisionedThroughput(25L, 25L));
    amazonDynamoDBClient.createTable(createTableRequest);
}


 private void run(){
    AmazonDynamoDBClient amazonDynamoDBClient = getDynamoDBLocalClient();
    DynamoDBMapper mapper = new DynamoDBMapper(amazonDynamoDBClient);
    InsuranceData insuranceData = new InsuranceData();
    createTable(mapper,amazonDynamoDBClient);
 }

POJO类
@DynamoDBTable(tableName = "InsuranceData")
public class InsuranceData {


private Integer siteId;
private String lob;
private InsuranceLobData multiItemLobData;
private InsuranceLobData standaloneLobData;

@DynamoDBHashKey(attributeName = "siteId")
public Integer getSiteId() {
    return siteId;
}

public void setSiteId(Integer siteId) {
    this.siteId = siteId;
}

@DynamoDBAttribute(attributeName = "F")
public String getLob() {
    return lob;
}

public void setLob(String lob) {
    this.lob = lob;
}

@DynamoDBTypeConverted(converter = InsuranceLobConverter.class)
public InsuranceLobData getMultiItemLobData() {
    return multiItemLobData;
}

public void setMultiItemLobData(InsuranceLobData multiItemLobData) {
    this.multiItemLobData = multiItemLobData;
}

@DynamoDBTypeConverted(converter = InsuranceLobConverter.class)
public InsuranceLobData getStandaloneLobData() {
    return standaloneLobData;
}

public void setStandaloneLobData(InsuranceLobData standaloneLobData) {
    this.standaloneLobData = standaloneLobData;
}
}

转换器
public class InsuranceLobConverter implements DynamoDBTypeConverter<String, InsuranceLobData> {
  private final static Gson gson = new Gson();


@Override
public String convert(InsuranceLobData object) {
    return gson.toJson(object);
}

@Override
public InsuranceLobData unconvert(String object) {
    return gson.fromJson(object, InsuranceLobData.class);
}

}

「有人看到这里的问题吗?」 「这已经解决了」 「我存储复杂对象 InsuranceLobData 的方式出现了问题。」
@DynamoDBDocument
public class InsuranceLobData   {

private boolean isActive;
private Set<String> locale;
private AbacusData abacusData;
private boolean isActiveForMobile;
private boolean isActiveForDesktop;

@Override
public String toString() {
    return "InsuranceLobData{" +
            "isActive=" + isActive +
            ", locale=" + locale +
            ", abacusData=" + abacusData +
            ", isActiveForMobile=" + isActiveForMobile +
            ", isActiveForDesktop=" + isActiveForDesktop +
            '}';
}

public InsuranceLobData(){}


public InsuranceLobData(boolean isActive, Set<String> locale, AbacusData abacusData, boolean isActiveForMobile, boolean isActiveForDesktop) {
    this.isActive = isActive;
    this.locale = locale;
    this.abacusData = abacusData;
    this.isActiveForMobile = isActiveForMobile;
    this.isActiveForDesktop = isActiveForDesktop;
}

@DynamoDBAttribute(attributeName = "isActive")
public boolean isActive() {
    return isActive;
}

public void setActive(boolean active) {
    isActive = active;
}

@DynamoDBAttribute(attributeName = "locale")
public Set<String> getLocale() {
    return locale;
}

public void setLocale(Set<String> locale) {
    this.locale = locale;
}

@DynamoDBTypeConvertedJson
public AbacusData getAbacusData() {
    return abacusData;
}

public void setAbacusData(AbacusData abacusData) {
    this.abacusData = abacusData;
}

@DynamoDBAttribute(attributeName = "mobile")
public boolean isActiveForMobile() {
    return isActiveForMobile;
}
public void setActiveForMobile(boolean activeForMobile) {
    isActiveForMobile = activeForMobile;
}

@DynamoDBAttribute(attributeName = "desktop")
public boolean isActiveForDesktop() {
    return isActiveForDesktop;
}


public void setActiveForDesktop(boolean activeForDesktop) {
    isActiveForDesktop = activeForDesktop;
}

}

没有必要添加DynamoDBDocument注释。@DynamoDBDocument


你设置了Lob的值吗,例如insuranceData.setLob("some data")?我已经尝试使用你的映射器类,并且它对我有效。我可以在表中看到属性“F”。 - notionquest
你能从你的问题中提取答案并将其发布为答案并接受吗?这会使情况更清晰。 - MartinTeeVarga
@sm4已完成。请检查。 - gursahib.singh.sahni
2个回答

1
@DynamoDBTypeConverted(converter = InsuranceLobConverter.class)

足以让DynamoDB了解我想在数据库中存储的数据类型。可能将注释@DynamoDBDocument添加到InsuranceLobData中会让它困惑,不知道如何存储数据。

因此,对我有用的是删除注释@DynamoDBDocument

希望能对他人有所帮助。


0
如果我理解正确的话,你的问题是 - 在表创建后为什么只能在表中看到“siteId”属性而看不到“F”?这是预期的。由于DynamoDB是一个NoSQL数据库,空表只会显示分区键和排序键(如果存在)作为属性。
只有当您在表中至少有一项时,才能看到“F”属性。

是的,这正是我的问题所在。因此,我将尝试添加一个项目,看看是否添加了 F 并将您的答案标记为已接受。谢谢。 :) - gursahib.singh.sahni
没成功。我创建了一个 InsuranceData 对象,填充了所有的值并添加了一项。它只更新了 siteId。我打印了表格描述。 - gursahib.singh.sahni
你能展示一下你的mapper.save()代码吗?你有收到任何错误吗? - Dasharath
这是一个简单的 mapper.save(insuranceData);,我没有收到任何错误信息。 - gursahib.singh.sahni
如果您能更新您的问题并附上代码的那一部分,将会很有帮助。 - Dasharath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接