Лучшие практики для хранения глобальных данных в приложении J2EE с использованием Hibernate - PullRequest
0 голосов
/ 03 августа 2011

Я ищу лучшее решение для хранения глобальных данных приложения Java EE с использованием Hibernate. Он будет состоять из пар ключ-значение. Пример:

projectStarted = "10-11-11"
developerNumber = 3
teamLeader = "John"

Как видите, все эти записи имеют разные типы.

Пока я вижу два варианта:

1) Создать объект GlobalData. Каждое его поле будет представлено как уникальный столбец в таблице и будет содержать уникальный параметр. Таким образом, у меня нет проблем с приведением типов, но я бы хотел избежать этого в случае большого количества настроек.

2) Создание объекта настройки. Каждое из них будет содержать два поля: ключ (первичный ключ) и значение и будет представлено как уникальная запись в таблице. Это предпочтительное решение, но мне кажется, что я получу много приведения типов, потому что настройки могут быть любого типа.

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

Спасибо.

Редактировать 1.

Да, спасибо, Кристиан. Просто получил похожую идею.

Что если у меня будет сущность Настройки, которая будет выглядеть так:

@Entity
@Table(name = "settings")
public class Setting {

    @Column
    private String key;
    @Column
    private String value;
    @Column
    private String converterClassFullName; //example by.lugovsky.MyConverter

    //Getters, setters
}

И класс GlobalData.

public class GlobalData {
    private Date projectStarted;

    private int developerNumber;

    private String teamLeader;

    Set<Setting> settings;

    //Getters and setters for all, except settings.

}

Таким образом, в основном моя идея состоит в том, чтобы преобразовать сущность Setting перед сохранением / обновлением / и т. Д. Я могу сделать это в своем DAO, но мне было интересно, смогу ли я также аннотировать класс GlobalData аннотацией @Entity без создания новой таблицы. Таким образом, я могу установить для аннотации OneToMany значение Set set и выполнить преобразования во внутренних методах @PrePersist и т. Д.

Позволит ли мне Hibernate это сделать?

Еще раз спасибо

1 Ответ

1 голос
/ 03 августа 2011

Вы можете сохранить класс-конвертер в БД и позволить ему проходить через данный конвертер для свойства перед использованием значения. JSF предлагает конвертер API:

public interface Converter{
    public Object getAsObject(FacesContext fc, UIComponent component, String value) throws ConverterException;

    public String getAsString(FacesContext fc, UIComponent component, Object obj) throws ConverterException;
}

Если у вас есть схема с

имя: строка

значение: строка

конвертер: класс

тогда вы могли бы сделать что-то вроде этого:

PropertyEntry pe = // Get from OR-Mapper
Converter c = (Converter) pe.getConverter().newInstance();
Object o = c.getAsObject(null, null, pe.getValue());
// use the object o instead of value

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

...