Выполнение дополнительных операций при построении модели ActiveJDBC

У меня есть база данных с одной таблицей words, поэтому моя Model в ActiveJDBC равна Word.

Когда строка из базы данных приводится к модели Word, я хочу выполнить некоторые дополнительные операции, такие как преобразование некоторых данных в перечисления для лучшей абстракции.

Я добавил в модель конструктор, который вызывается соответствующим образом, но попытка доступа к каким-либо данным возвращает null. Вот класс Word (сокращенно):

public class Word extends Model {

    private static final Logger log = LogManager.getLogger(Word.class);
    public static final String SPELLING = "ortho";

    public Word() {
        log.info("In constructor");
        log.info("Word spelling: " + getSpelling());
    }

    public String getSpelling() {
        return this.getString(SPELLING);
    }
}

но получаю в логах следующее:

10:31:49.372 [main] INFO Word - In constructor
10:31:49.373 [main] INFO Word - Word spelling: null

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

Должен ли я оставить Word пустым классом, например:

public class Word extends Model {}

и пусть другой класс возьмет его в конструктор? Это создало бы много ненужного мусора, особенно при работе с List<Word>... как лучше всего манипулировать данными во время создания объекта Model в ActiveJDBC?


person Chris Cirefice    schedule 12.09.2015    source источник


Ответы (1)


Вам необходимо использовать CallbackListener или CallbackAdapter.

См. страницу обратных вызовов жизненного цикла.

Причина, по которой ваше НАПИСАНИЕ равно null, заключается в том, что во время создания модели значения атрибутов еще не установлены.

Вам нужно что-то вроде этого:

public class Word extends Model{
   public void afterLoad(){
     String spelling = getString(SPELLING); //you have data  now
   }
}
person ipolevoy    schedule 13.09.2015
comment
Привет, Игорь, я читал документацию, но никогда не видел ничего, связанного с обратными вызовами. Я использую Rails, поэтому я разочарован в себе, что даже не подумал об этом! Это именно то, что я искал, большое спасибо! PS - Мне нравится ваша работа над ActiveJDBC. Это сделало мое кодирование намного более приятным :) - person Chris Cirefice; 13.09.2015
comment
круто, наслаждайтесь. Если вы используете Rails, вы будете чувствовать себя как дома и с ActiveWeb. - person ipolevoy; 14.09.2015
comment
@ipolevoy в ActiveJDBC 1.4.11 эти обратные вызовы не вызываются, есть идеи, что может вызвать такое поведение? - person perrohunter; 27.09.2015
comment
@perrohunter, если это так, то тест: github.com/javalite/activejdbc/blob/master/activejdbc/src/test/ никогда не пройдет. - person ipolevoy; 27.09.2015