Отображение вычисленных свойств с JPA

Все, что записал Christian Lescuyer, корректно. Заметьте, однако, что он сказал, что "Я буду" и не, "Вы должны". Выбор не настолько легок.

, В первую очередь, безопасность не является проблемой в выборе. У Вас должна быть проверка защиты на сервере при выполнении действия. То, которое код решает показать/скрыть кнопке, которая приводит к действию, не важно.

, Который оставляет нас только с одним недостатком выполнения, показывают/скрывают логику в JavaScript - HTML, отправленный пользователю, больше, чем необходимый. Это не может быть грандиозным предприятием.

Наличие показывает/скрывает, что логика в PHP действительно имеет минус, все же. Требуемый код PHP обычно суп тега . Код Akira обеспечивает хороший пример того, как он обычно делается.

Соответствующий код JavaScript, вероятно, выглядел бы примерно так:

if (logged())
{
    elementSecretArea.style.display = "list-item";
}

(предполагающий, что элементы, которые могли быть скрыты, имеют display:none по умолчанию).

Этот стиль также позволяет хороший сценарий "Ajax": пользователь видит страницу секретная область, w/o, пароль исходных данных, видит секретную область все, не обновляя страницу.

Так, если у Вас уже есть сценарий, который работает, когда Ваша загрузка документа по другим причинам, я серьезно рассмотрел бы наличие, показывают/скрывают логику там.

11
задан Aleksandar Seovic 31 August 2009 в 22:21
поделиться

2 ответа

То, что вы описали, не является вычисляемым свойством в смысле JPA. Вы сами вычисляете его в своем методе - просто отметьте этот метод как @Transient , и JPA проигнорирует его.

Если вам действительно нужно вычисляемое свойство (где "вычисленное" означает "вычисленное с помощью выражения SQL "), вам нужно будет аннотировать его в соответствии с вашим провайдером JPA. Для Hibernate это можно сделать с помощью аннотации @Formula :

@Formula("col1 * col2")
public int getValue() {
 ...
}

У других провайдеров могут быть свои собственные способы настройки; стандарта JPA нет.

10
ответ дан 3 December 2019 в 06:22
поделиться

Возможно, аннотация PrePersist можно использовать для этого.

@Column(name = "TOTAL_AMOUNT")
private BigDecimal totalAmount;

@PrePersist
public void updateTotalAmount() {
    BigDecimal amount = BigDecimal.ZERO;
    for (InvoiceLineItem lineItem : lineItems) {
        amount = amount.add(lineItem.getTotalAmount());
    }
    this.totalAmount = amount;
}
4
ответ дан 3 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: