Значение по умолчанию для объекта JPA - PullRequest
1 голос
/ 23 января 2012

У меня есть объект со значениями по умолчанию и вычисляемым полем следующим образом:

public class Target{
    @Transient
    public Long       total;

    @Min(0)
    @Column(columnDefinition="default 0")
    public Long       val1 = 0L;
    @Min(0)
    @Column(columnDefinition="default 0")
    public Long       val2 = 0L;

    public Target() {
        this.total = Long.valueOf(0L);
        this.val1 = Long.valueOf(0L);
        this.val2 = Long.valueOf(0L);
    }

    public Long calcTotal() {
        return val1 + val2 ;
    }

    public void setVal1(Long val) {
        this.val1 = checkNotNull(val);
        total = calcTotal();
    }

    public void setVal2(Long val) {
        this.val2 = checkNotNull(val);
        total = calcTotal();
    }
}

Однако всякий раз, когда сущность загружается JPA, вызываются сеттеры, и в calc вызывается исключение NullPointerException. Есть ли в любом случае значения по умолчанию, прежде чем JPA вызовет сеттеры?

1 Ответ

5 голосов
/ 23 января 2012

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

Во-вторых, поле total отсутствуетв коде.

В-третьих, это поле вообще не должно существовать, поскольку оно может быть вычислено из двух других полей.Просто позвольте другим классам вызывать calcTotal() для доступа к его значению.И переименуйте этот метод getTotal().

О, и поля должны быть частными, а не общедоступными.

Если вы действительно хотите сохранить результат для повторного использования, вычислите его лениво и сбросьте его на ноль, когда один из операндовизменено:

public Long getTotal() {
    if (total == null) {
        total = val1 + val2;
    }
    return total;
}

public void setVal1(Long val1) {
    this.val1 = val1;
    this.total = null;
}

public void setVal2(Long val2) {
    this.val2 = val2;
    this.total = null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...