我应该如何在DynamoDB中实现一对一的关系?

时间:2017-10-19 16:22:40

标签: java spring amazon-dynamodb one-to-one

我们已经拆分了我们的产品和价格模型,因为两者都相当复杂,并且它们分开用于编辑和显示的用例。

我想从Product中相对直接访问一些更常见的Price字段,因为use-link-if-it-it-and-create-it-it-it-not-logic出现了很多而且中等复杂:我不想在可能需要它的十个地方的每一个中重复十几行,单独测试它们,然后必须记住如果/当逻辑改变时更新它们。将这个逻辑放在产品上是有道理的,因为我习惯于将“价格”视为产品的属性。

不幸的是,这意味着我正在尝试注入/自动访问Product类上的PriceRepository。我觉得这不是一个好主意,但感觉所有的想法都很糟糕。

我们在Spring Framework中使用DynamoDB和Java。这是该类的玩具版本:

@DynamoDBTable(tableName = "Product")
@Configurable
public class Product {
    private String id;
    private Price price;

    @Inject
    @Transient
    @DynamoDBIgnore
    private static transient PriceRepository priceRepository;

    @DynamoDBHashKey(attributeName = "Id")
    @DynamoDBAutoGeneratedKey
    public String getId() {return id}
    public void setId(String id) {this.id = id;}

    @DynamoDBIgnore
    public List<PricingOption> getPricingOptions() {
        setOrCreatePrice();
        return price.getPricingOptions();
    }

    public void setPricingOptions(List<PricingOption> options) {
        setOrCreatePrice();
        price.setPricingOptions(options);
    }

    public void setOrCreatePrice() {
        // simplified, skipping the cases when this.getId() returns null
        if (price != null)
            return;
        Price price = priceRepository.findOneByProductId(this.getId());
        if (price != null) {
            this.price = price;
            return;
        }
        price = new Price();
        price.setProductId(this.getId());
    }
}

通过产品查看PricingOptions目前与添加产品,更新产品,根据客户需求选择定价选项,输入营销数据等相关联。每个位置都有一个单独的Bean,并以稍微不同的方式使用产品。

这似乎应该是一种相当普遍的事情,但我没有看到与OOP,DRY以及Spring应该将事物链接在一起的方式一致的选项。也许我应该为可能需要数据的所有Beans插入一个共同的超类?我很欣赏一些建议。

0 个答案:

没有答案