当前位置: 首页 > 知识库问答 >
问题:

AWS DynamoDBJavaSDK替代注释

殷功
2023-03-14

我希望避免在类上使用DynamoDB注释,但仍然能够使用映射器从DynamoDB进行写和读。我使用Java SDK从DynamoDB读写(使用提供的DynamoDBMapper)。

说我有这个Model.java

@DynamoDBTable(tableName="Model")
public class Model {

    private Integer id;
    private String title;

    @DynamoDBHashKey(attributeName="ModelId")  
    public Integer getId() { return id;}
    public void setId(Integer id) {this.id = id;}

    @DynamoDBAttribute(attributeName="Title")  
    public String getTitle() {return title; }
    public void setTitle(String title) { this.title = title; }
}

我会像往常一样写信给它

Model model = new Model();
//... random information

DynamoDBMapper mapper = new DynamoDBMapper(client);
mapper.save(model);

这很好,但我的域对象到处都是特定于DynamoDB的注释。有没有办法让一个类包装域对象(没有任何注释)。在下面的例子中,我将寻找DynamoDBModelWrapper

public class Model {
    private Integer id;
    private String title;

    public Integer getId() { return id;}
    public void setId(Integer id) {this.id = id;}

    public String getTitle() {return title; }
    public void setTitle(String title) { this.title = title; }
}

public class DynamoDBModelWrapper extends Model { ... }

Model model = new Model();
//... random information

DynamoDBMapper mapper = new DynamoDBMapper(client);
mapper.save(DyanamoDBModelWrapper(model));

干杯,谢谢

共有3个答案

孙书
2023-03-14

应用程序和DynamoDB SDK之间添加数据访问抽象层。您可以有单独的域和数据库模型类,数据访问层可以在它们之间进行转换。

它是这样工作的。

定义一个MyTableDataAccess接口,并实现MyTableDataAccessDynamoDBImpl或任何你想称之为它的东西。您的应用程序代码将调用MyTableDataAccess的方法,这些方法应该根据您的域和业务用例来定义。MyTableDataAccessDynamoDBImpl将负责在域和数据库模型之间进行转换,并进行实际的Dynamodb调用。

现在,域和数据库模型可能会有完全相同的字段,所以这看起来可能是多余的,但是这种策略有一些额外的好处。

  • 您可以使域类不可变。DynamoDBMapper需要一个默认的构造函数和所有要读取的字段的设置器。通过使用不同的域和数据库模型,您可以使DB模型成为可变的POJO,并且您的域类可以是不可变的
祁嘉言
2023-03-14

这不是一个很好的解决方案(IMO),所以我希望有人提出更好的建议,但我做到了以下几点:

public class Model {
    private Integer id;
    private String title;

    public Integer getId() { return id;}
    public void setId(Integer id) {this.id = id;}

    public String getTitle() {return title; }
    public void setTitle(String title) { this.title = title; }
}

@DynamoDBTable(tableName="Model")
public class DynamoDBModelWrapper  {

    private final Model model;

    DynamoDBModelWrapper() {
        this.model = new Model();
    }
    DynamoDBModelWrapper(final Model model) {
        this.model = model;
    }

    @DynamoDBHashKey(attributeName="ModelId")  
    public Integer getId() { return model.id;}
    public void setId(Integer id) {model.id = id;}

    @DynamoDBAttribute(attributeName="Title")  
    public String getTitle() {return model.title; }
    public void setTitle(String title) { model.title = title; }
}

然后,当您从DynamoDB保存/加载时,您可以实例化DynamoDBModelWrapper,并在其余时间内使用该对象而无需任何Dynamo特定注释。

Model model = new Model();
//... random information

DynamoDBMapper mapper = new DynamoDBMapper(client);
mapper.save(new DynamoDBModelWrapper(model));
漆雕育
2023-03-14

这似乎是个坏主意。实际上,您必须强制所有表键和索引具有相同的名称。模型包装器不能只是将相同的注释应用于每个模型属性,它必须知道将哪个注释应用于哪个属性,这意味着仍然将注释应用于模型类,或者因为这是不允许的,迫使模型类在一种特殊的方式。例如,您的主散列键属性可能必须被称为主散列键。

此外,您将无法使用DyanmoDBMapper的一些真正强大的部分,如复杂和任意的数据映射。

值得一提的是,你至少可以把东西整理一下。你的模型课上有一些多余的课文。仅当模型属性的名称与表属性的名称不同时,才需要指定attributeName。如果它们匹配,你可以省略它。模型类名和表名也是如此。所以你可以做:

Table schema:
TableName: Model
Partition Key Attribute: id
Attribute: title

然后你的模型课会是这样的

@DynamoDBTable
public class Model {

    private Integer id;
    private String title;

    @DynamoDBHashKey  
    public Integer getId() { return id;}
    public void setId(Integer id) {this.id = id;}

    @DynamoDBAttribute 
    public String getTitle() {return title; }
    public void setTitle(String title) { this.title = title; }
}

注释仍然存在,但看起来整洁多了。

 类似资料:
  • 我正在尝试编写一个注释处理器来插入类上的方法和字段......留档如此稀疏。我走不远,我不知道我是否正确地接近它。 处理环境提供了一个对象,它具有创建新源文件和类文件的方便方法。这些工作正常,但后来我试图弄清楚如何读取现有源文件,它提供的只是“getResources”。所以在我的处理器实现中,我这样做了: 我的第一个困惑是我不禁觉得(获取合格的类型名称并将其转换为包和源文件路径)不是解决问题的好

  • 问题内容: 我要显示图像而不是小 别针 。 有人可以在这里放置一些有用的代码,或告诉它怎么做吗? 我希望我的图片 pinks.jpg 会显示在地图上,而不是默认的图钉视图( 石头图钉形状 ),而是固定位置。但是我仍然得到该引脚的默认图像。 问题答案: 如果要将自己的图像用于注释视图,则应创建一个,而不是。 是的子类,因此具有属性,但通常会覆盖该属性并绘制图钉图像(这就是它的作用)。 因此,将代码更

  • 朋友 Jackson框架提供了基于注释的方法来在序列化过程中发出类型信息。 我不想在我的任何类中使用@JsonTypeInfo注释。 上述注释是否有替代方案。 如果是,请举例说明如何做到这一点。

  • 问题内容: 这是一个从来没有一个正确答案的问题,我已经在网上搜索了很多次,却找不到解决方案。 它适用于Firefox,Chrome。我的responseText将像Réunion这样返回char,它将显示为奇怪的符号。 我尝试了许多方法,例如编码和解码,在响应文件中设置标头都无效。我没主意了。请帮助某人。 在主文件中,确保设置了内容类型和字符集。 在您的AJAX加载页面中,确保您位于顶部。 问题解

  • 问题内容: 问题 在解决这个问题之后,似乎基于文件或磁盘的实现可能是解决我在此处提到的问题的正确解决方案。精简版: 目前,我已将实施为。 条目以相当固定的速率连续添加到其中。稍后对此进行详细说明。 最终,无论如何,这意味着JVM耗尽了堆空间。 在工作中,(强烈)建议我使用SQLite解决此问题,但是在问了上一个问题之后,我认为数据库不是适合此工作的合适工具。所以- 让我知道这听起来是否疯狂 -我认

  • 问题内容: 首先-我的描述;) 我从服务器收到XmlHttpRequests JSON响应。MySQL驱动程序将所有数据输出为字符串,PHP将其按原样返回,因此任何整数都将作为字符串返回,因此: JS中的parseInt()函数是否有任何快速替代方法(hack),可以解析纯数字字符串,例如 问题答案: 要转换为整数,只需使用一元+运算符,它应该是最快的方法: 可以通过类似的方式转换为其他类型: 更