вычисляемое поле и Hibernate - PullRequest
1 голос
/ 03 мая 2011

Напомните мне: как мне сопоставить класс Java с вычисляемым полем, которое должно быть сохранено?Т.е.:

public class PolicyHolder {
    private int height;
    private int weight;
    private boolean smoker;
    private boolean exerciser;

    // getters and setters for those properties omitted for brevity's sake.

    public int getLifeExpectancy() {
        return Utilities.computeBMI(height, weight) + (smoker ? 0 : 20) + (exerciser ?20 : 0);
    end;
}

У меня есть бизнес-логика на Java в getLifeExpectancy (), и я собираюсь иногда вызывать ее из Java.Но я также хочу, чтобы значение сохранялось вместе с остальной частью PolicyHolder.Как я могу отобразить этот класс, используя Hibernate?

1 Ответ

0 голосов
/ 04 мая 2011

Способ, которым я делал это в прошлом (хотя мне не нравится сохранение вычисленных значений), заключается в том, чтобы получить получатель для значения просто вернуть поле, а все остальные поля, влияющие на вычисленное значение, пересчитать заново. это каждый раз, когда они меняются. Делая это, вы можете просто сказать hibernate, чтобы сохранить вычисленное поле.

public class PolicyHolder {
    private int height;
    private int weight;
    private boolean smoker;
    private boolean exerciser;
    private lifeExpectancy;  //Tell hibernate to persist this field

    // getters omitted for brevity's sake.

    public void setHeight(int aHeight) {
        height = aHeight;
        computeLifeExpectancy();
    }

    public void setWeight(int aWeight) {
        weight = aWeight;
        computeLifeExpectancy();
    }

    public void setSmoker(boolean aSmoker) {
        smoker = aSmoker;
        computeLifeExpectancy();
    }

    public void setExerciser(boolean anExerciser) {
        exerciser = anExerciser;
        computeLifeExpectancy();
    }

    public int getLifeExpectancy() {
        return lifeExpectancy;
    }

    /**
     * Computes and saves the life expectancy.
     */
    private void computeLifeExpectancy() {
        lifeExpectancy = Utilities.computeBMI(height, weight) + (smoker ? 0 : 20) + (exerciser ?20 : 0);
    }
}

Примечание: Большим недостатком этого подхода (на мой взгляд) является то, что все сеттеры теперь имеют побочный эффект (т. Е. Делают больше, чем просто устанавливают значение, которое, по их словам, они устанавливают).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...