OpenJPA: несколько @Embedded против одного @ElementCollection - PullRequest
0 голосов
/ 02 марта 2012

Я пытаюсь решить, какую аннотацию использовать. Можете ли вы высказать свое мнение?

Что у меня сейчас:

@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. Учитывая, что теперь мне придется создавать JOIN-соединения в SQL и т. Д. Как это повлияет на производительность? Допустим, я использую Oracle 11g и у меня 100 000 записей баланса (и, следовательно, 300 000). суммы). Заметит ли я замедление в приложении после изменения?

1 Ответ

0 голосов
/ 02 марта 2012
  1. Да, это правильно.
  2. Невозможно сказать без тестирования. Я не понимаю, как это может быть быстрее, чем непосредственно хранить шесть полей в таблице.

Чего я не понимаю, так это почему вы не удовлетворены своими тремя полями. Если вы хотите иметь в своей сущности метод Map<AmountType, Amount> 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;
}
...