【问题标题】:OpenJPA: several @Embedded vs one @ElementCollectionOpenJPA:几个@Embedded 与一个@ElementCollection
【发布时间】:2012-03-01 22:31:09
【问题描述】:

我正在尝试决定使用哪个注释。你能发表你的意见吗?

我现在拥有的:

@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 金额)。更改后我会注意到应用程序的速度变慢吗?

【问题讨论】:

  • JPA(1 或 2 或 2.1)没有这样的 @EmbeddedCollection 注释,也不在 OpenJPA 文档中。也许澄清你的意思......
  • @DataNucleus 你是对的,我的意思是 \@ElementCollection 注释。另外,我已经完全重写了这个问题以使其更清楚。感谢您的反馈。

标签: java jpa jpa-2.0 openjpa


【解决方案1】:
  1. 是的,没错。
  2. 没有测试就不可能说。我看不出它比直接将六个字段存储在表中更快。

我不明白为什么你对你的三个领域不满意。如果您希望能够在您的实体中拥有一个 Map&lt;AmountType, Amount&gt; getAmounts() 方法(和相应的设置器),那么没有什么能阻止您添加它并自己实现它:

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;
}

【讨论】:

  • 感谢您的回复,JB。我希望能够遍历这些对象...是的,我可以实现您描述的方法,但我认为使用 @ElementCollection 将是一个更清洁的解决方案,并且是“正确的方法”。我的意思是,如果从概念上来说这些对象是一个集合,那还不足以将它们映射成这样吗?
  • 是的,你可能是对的。但是,它们也应该在自己的表中。
猜你喜欢
  • 1970-01-01
  • 2012-08-12
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 2021-11-23
  • 2018-10-10
  • 2012-12-15
相关资源
最近更新 更多