OpenJPA:几个@Embedded与一个@ElementCollection

时间:2012-03-01 22:31:09

标签: java jpa jpa-2.0 openjpa

我正在尝试决定使用哪个注释。你能提出自己的意见吗?

我现在拥有的:

@Entity
public class Balance {
    @Embedded
    private Amount amountAtm;

    @Embedded
    private Amount amountBranch;

    @Embedded
    private Amount amountVault;
}

@Embeddable
public Amount {
    private BigDecimal debit;
    private BigDecimal credit;
}

我想将其更改为:

@Entity
public class Balance {
    @ElementCollection
    private Map<AmountType, Amount> amounts;
}

public enum AmountType {
    ATM, BRANCH, VAULT;
}

金额将保持不变。

这种变化的原因是因为余额中的金额在概念上是一个集合。我要么同时显示/更改所有这些,要么根本不显示/更改所有这些。所以,我把它们视为一个群体。

问题:

  1. 现在金额与余额存储在同一个表中(我覆盖列名,代码中没有显示)。但是,如果我进行此更改,则无法将所有这些数据存储在一个表中。我必须将金额存储在一个单独的表中。 这是正确的吗?

  2. 考虑到现在我将不得不在SQL等中创建JOIN。这将如何影响性能?假设我使用的是Oracle 11g并且我有100,000个余额记录(因此300,000金额)。我会注意到更改后应用程序的减速吗?

1 个答案:

答案 0 :(得分:0)

  1. 是的,这是对的。
  2. 没有测试就不可能说。我没有看到它比直接在表中存储六个字段更快。
  3. 我不明白为什么你对你的三个领域不满意。如果您希望在您的实体中拥有Map<AmountType, Amount> getAmounts()方法(以及相应的setter),那么没有什么可以阻止您添加它并自行实现它:

    public Map<AmountType, Amount> getAmounts() {
        Map<AmountType, Amount> result = new HashMap<AmountType, Amount>(3);
        result.put(AmountType.ATM, amountAtm);
        result.put(AmountType.BRANCH, amountBranch);
        result.put(AmountType.VAULT, amountVault);
        return result;
    }