DynamoDBMapper注释。 OneToMany映射

时间:2015-03-16 03:26:42

标签: java amazon-dynamodb

我在Amazon DynamoDB中有一个员工表(即项目)。该表的属性是{employee_id,name,manager_id}

该类使用以下代码在Java中表示:

@DynamoDBTable(tableName = "Employee")
public class Employee {
    private String employeeId;
    private String name;
    private List<Employee> subordinates;

    @DynamoDBHashKey
    public String getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(final String employeeId) {
        this.employeeId = employeeId;
    }

    @DynamoDBAttribute(attributeName = "name")
    public String getIntegerAttribute() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Employee> getSubordinates() {
        return subordinates;
    }

    public void setSubordinates(List<Employee> subordinates) {
        this.subordinates = subordinates;
    }
}

给出以下组织结构图

A
-B
 |
  --- B1
 |
  --- B2
-C
 |
  --- C1

如果我要求员工A,B和C应该加载A的下属.B1和B2应该作为B的下属加载.C1应该作为C的下属加载。

使用Hiberate的@OneToMany注释很容易实现上述功能。什么是在Dynamo中实现这一目标的推荐方法?

谢谢!

2 个答案:

答案 0 :(得分:1)

DynamoDB的HashRange架构本身支持一对多。

您可以像这样创建表格:

Subordinate-Table (for storing relationship)
HashKey: EmployeeId (for manager)
RangeKey: EmployeeId (for subordinates)

Employee-Table (for storing employee info)
HashKey: EmployeeId
Attribute: Name

对于您的样本组织结构图,您的从属表将如下所示:

Hash: A Range: B
Hash: A Range: C
Hash: B Range: B1
Hash: B Range: B2
Hash: C Range: C1

要获得经理A的所有子标识,您只需要dynamdob.query(HashKey=="A")

关于直接获取员工数据而无需额外调用Eployee表的问题:您可以将上面的两个表合并到一个表中:

Company-Structure-Table:
HashKey: EmployeeId (manager)
RangeKey: EmployeeId (subordinates)
Attribute: Name (name of the subordinate)

关于避免手动获取管理器下面的所有下属的第二个问题(searchi递归),我的想法是:DynamoDB为您提供了一个数据库原语,您可以在其上构建应用程序。您希望设计模式以使原语非常有效。您可以在DynamoDB之上构建自己的逻辑。递归搜索管理器下面的所有员工是特定于应用程序的逻辑之一。您可以轻松地构建它并将其并行化。我不认为mapper lib包含它。

答案 1 :(得分:0)

@DynamoDBTable(tableName = "Table1")
public class ItemDTO  {...} 

itemDTO是ItemDTO的实例,代表'Table1'和'Table2'中存在的项目,但itemDTO已更改。现在,我要将这些更改保存在两个表中。

# update of the itemDTO in 'Table1'
mapper.save(itemDTO)
# create TableNameOverride config for 'Table2'
TableNameOverride table2Override = new DynamoDBMapperConfig.TableNameOverride('Table2')
# update of the itemDTO in 'Table2' by passing new DynamoDBMapperConfig w/ table2Override
mapper.save(itemDTO, new DynamoDBMapperConfig(table2Override))