Java 使用DynamoDBMapper是个坏主意吗?

Java 使用DynamoDBMapper是个坏主意吗?,java,amazon-dynamodb,Java,Amazon Dynamodb,我从DynamoDB开始,在DynamoDB Apper上遇到了这个说明 假设我有一个用户POJO,DynamoDB注释添加如下: @DynamoDBTable(tableName = "users") public class User { private Integer id; private Set<String> friends; private String status; @DynamoDBHashKey public Int

我从DynamoDB开始,在DynamoDB Apper上遇到了这个说明

假设我有一个用户POJO,DynamoDB注释添加如下:

@DynamoDBTable(tableName = "users")
public class User {

    private Integer id;
    private Set<String> friends;
    private String status;

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

    @DynamoDBAttribute
    public Set<String> getFriends() { return friends; }
    public void setFriends(Set<String> friends) { this.friends = friends; }

    @DynamoDBAttribute
    public String getStatus() { return status; }
    public void setStatus(String status) { this.status = status; }
}
@DynamoDBTable(tableName=“users”)
公共类用户{
私有整数id;
私交朋友;
私有字符串状态;
@发电机钥匙
公共整数getId(){return id;}
public void setId(整数id){this.id=id;}
@发电机属性
public Set getFriends(){return friends;}
public void setFriends(Set friends){this.friends=friends;}
@发电机属性
公共字符串getStatus(){return status;}
public void setStatus(字符串状态){this.status=status;}
}
由于POJO最有可能用于在典型应用程序中跨层传输数据,例如从持久性层到API层。。。把它与特定的数据库技术联系起来听起来是个坏主意

在关系领域中,可以使用Java持久性API注释,它与数据库无关。但对于DynamoDB来说,情况并非如此。如果将来数据库发生更改,我们将需要修改POJO类。听起来不是一个好的做法


那么应该使用DynamoDBMapper,还是只使用较低级别的API

提供映射器的唯一目的是自动创建POJO,您应该使用它

因为POJO最有可能用于跨层传输数据 典型应用,例如从持久层到API层。。。这 把它与特定的数据库技术联系起来听起来是个坏主意

这是该技术的一个已知限制,甚至hibernate(一个非常流行的ORM工具)也提供了一个类似的工具从db创建pojo,并且它也有相同的限制,如果您的db随着时间不断变化,您可以创建新的pojo


我强烈建议您使用DynamoDBMapper

JPA的目标是不依赖数据库,但任何实际将实际应用程序从一个数据库迁移到另一个数据库的人都可以告诉您,它不能处理所有的边缘情况

虽然您认为DynamoDB注释特定于DynamoDB的观点是正确的,但它确实提供了一些好处,因为它使您的应用程序逻辑持久性不可知。例如,如果不使用注释,您将不得不在整个应用程序中使用DynamoDB对象作为
Map
。通过使用映射器,您可以将存储在DynamoDB中的项作为
User
对象使用,并且您的业务逻辑都可以在
User
对象上执行

现在,假设您需要切换以将用户存储在不同的数据库中…MongoDB,甚至关系数据库,无论出于何种原因。是的,您必须将
User
对象上的注释更改为新持久性存储所需的注释(就像您使用JPA但从MySQL切换到Postgres时必须修改其中一些注释一样),但是您的应用程序逻辑,即整个应用程序中
用户
对象上的业务规则和验证不必更改


因此,虽然您确实必须使用DynamoDB注释来使用映射器,但在我看来,能够在域实体上直接实现应用程序逻辑所带来的好处远远超过了与持久性解决方案耦合的任何顾虑,并且比您所断言的更能反映JPA的好处

我不知道我可以用dynamodb mapper自动创建POJO。我错过什么了吗?