Сохраняемое свойство JPA 2.0 без установщика - PullRequest
3 голосов
/ 20 февраля 2011

Я использую JPA 2.0, точнее Eclipselink.Вот моя проблема:

У меня есть объект с таким свойством, как "isPaid".это свойство является результатом некоторых вычислений, которые сущность выполняет с некоторыми другими своими полями.поскольку он получен из других полей, свойство не имеет метода установки.

Например, метод получения выглядит примерно так:

public boolean isPaid() {
  return this.totalAmount - this.amountPaid == 0;
}

это просто пример.Дело в том, что я хочу, чтобы это свойство было рассчитано и сохранено, поэтому я могу выполнить запрос jpql, например:

SELECT d FROM Debt d WHERE d.isPaid = true

Возможно ли это?Есть ли обходной путь для этого?.

Я не хочу получать все сущности для вызова этого метода, а затем фильтровать те, которые возвращают true.

Ответы [ 2 ]

4 голосов
/ 20 февраля 2011

Вот несколько вариантов:

1) Создайте запрос jpql, который напрямую делает то, что вам нужно:

select d from Debt d where (d.totalAmount - d.amountPaid) = 0

Преимущества подхода в том, что он прост и будетвсегда работать.Недостатком является то, что ваш запрос должен понимать, как рассчитывается платная логика.

2) Создайте постоянное платное значение, в котором хранится вычисленное значение:

@Basic
private boolean paid;

public boolean isPaid() {
    return this.paid;
}

private void updateCalculations() {
    this.paid =  (this.totalAmount - this.amountPaid == 0);
}

// using int as example here
public void setTotalAmount(int totalAmount) {
    this.totalAmount = totalAmount;
    updateCalculations();
}
public void setAmountPaid(int amountPaid) {
    this.amountPaid = amountPaid;
    updateCalculations();
}

Преимущество этого подхода заключается в том, чточто вы сможете создать запрос jpql, который непосредственно проверяет логическое значение, т. е.

select d from Debt d where d.paid = true;

Очевидно, недостатком этого подхода является то, что вам нужно обязательно пересчитывать значение при каждом обновлении.ценности.Тем не менее, это может быть облегчено, если вы рассчитываете только при доступе.Это означает, что в вашем методе isPaid () вы вычисляете значение, присваиваете его платному атрибуту, а затем возвращаете значение.Если вы решите использовать этот подход, вам потребуется добавить методы @PrePersist и @PreUpdate, которые выполняют расчет с оплатой и обновляют атрибут с оплатой до сохранения компонента в хранилище данных (гарантирует, что оплачиваемое значение всегда покрывается.

Если вы используете аннотации JPA для самих своих атрибутов, вы можете иметь метод получения без установщика и при этом иметь возможность корректно получать и сохранять значения в базе данных.

4 голосов
/ 20 февраля 2011

Посмотрите на это: Отображение вычисленных свойств с помощью JPA ?

Обычно вам нужен тот или иной установщик, чтобы сделать JPA счастливым.

...