2016-03-07 71 views
0

我已经开始在DynamoDB和跨越该指令来到DynamoDBMapper http://aws.amazon.com/articles/0802321832592496正在使用DynamoDBMapper一个坏主意?

让说我有一个用户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; } 
} 

由于POJO是最有可能用于在一个典型的应用程序中传输数据,例如从持久层到API层......这听起来像是一个坏主意,它将它与特定的数据库技术联系起来。

在关系领域,可以使用Java Persistence API注释,它是数据库不可知的。但对于DynamoDB,情况并非如此。如果将来数据库发生变化,我们将需要修改POJO类。听起来不像是一种好的做法。

那么应该使用DynamoDBMapper,还是应该使用低级API?

回答

1

JPA的目标是数据库无关,但任何人谁实际上已经迁移实际的应用程序从一个数据库到另一个可以告诉你,它不”处理所有的边缘情况。

虽然您指出DynamoDB注释特定于DynamoDB是有效的,但它确实具有一些优点,因为它可以保持您的逻辑持久性不可知。例如,通过不使用注释,您将不得不在整个应用程序中使用DynamoDB对象作为Map<String, Object>。通过使用映射器,您可以改为使用存储在DynamoDB中的项目作为User对象,并且您的业务逻辑可以全部在User对象上执行。

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

因此,尽管您必须使用DynamoDB注释来使用映射器,但您能够直接在域实体上实现应用程序逻辑所带来的好处远远超过耦合到持久性解决方案的任何顾虑,并且镜像在我看来,JPA的益处比你声称的更紧密。

0

该映射器仅用于创建POJO的唯一目的,您应该使用它。

由于POJO是最有可能用于携带在 典型应用,e.g从持久层API层......这 听起来像一个坏主意,其绑定到特定的数据库技术,跨层数据。

这是该技术,即使是休眠(一个非常流行的ORM工具)的一个已知的限制已经提供了类似的工具来创建数据库的POJO,它也有相同的限制,如果您的数据库不断随时间变化你可以创建新的POJO的

我强烈建议你使用DynamoDBMapper

+0

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

相关问题