Сохранение настроек приложения в Hibernate - PullRequest
2 голосов
/ 23 июня 2010

Каков наилучший / самый красивый / самый гибкий способ хранения настроек приложения в Hibernate?

Является ли использование таблицы с одной строкой подходом или есть лучший способ?Было бы неплохо сохранить дополнительные настройки в том же месте / таблице, но за пределами домена приложения.

Я экспериментировал с таблицей ключ / значение, например:

Key      | Value
-------------------------
width    | 20px
height   | 40px
showall  | true
etc.

Но, похоже, это не очень подходит Hibernate.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 24 июня 2010

Чтобы строго ответить на ваш вопрос, вы можете отобразить таблицу ключ / значение с помощью Hibernate:

@Entity
public class Settings {
    @Id
    private String key;
    private String value;

    // getters, setters, etc
}

Но нужно ли вам это хранить в базе данных или нет, ядумаю, я бы выбрал Commons Configuration вместо Hibernate (или, может быть, просто Properties объект, если вам не нужно сохранять настройки в базе данных Preferences API, предложенный @ring).

2 голосов
/ 23 июня 2010

Я бы посоветовал вам организовать свою модель домена на основе того, как используются значения (аналогично тому, как вы бы организовали любую модель ОО), а затем сохранить эти объекты.В вашем примере у вас будет объект Window с атрибутами width, height и showall, который затем будет сохранен в базе данных как одна строка / объект.

Таким образом, вы можете получить следующее (гипотетическая ситуация):

id | layoutType | width | height | images
-----------------------------------------------
0  | widescreen | 1000  | 500    | true
1  | normal     | 600   | 500    | true
2  | mobile     | 320   | 480    | false 
1 голос
/ 24 июня 2010

Я фактически реализовал это как пару ключ / значение в C # с помощью nHibernate.Таблица такая же, как вы описали, только с парой ключ / значение.Когда я хочу получить / установить значение, мой уровень персистентности принимает «ключ» (как перечисление) и возвращает объект ApplicationSetting.Этот объект на самом деле является просто оболочкой для пары ключ / значение.

Простой пример (на языке c #):

class ApplicationSetting
{
  private string theApplicationSettingString = string.Empty;

  /// <summary>
  /// The name of the setting.
  /// </summary>
  public virtual ApplicationSettingKey SettingName
  {
     //I use enumerations here so that I'm guaranteed to get a key I
     //already know about and not a random string.
     get
     {
        return (ApplicationSettingKey)Enum.Parse(
           typeof(ApplicationSettingKey), theApplicationSettingString);
     }
     set
     {
        theApplicationSettingString =
           Enum.GetName(typeof(ApplicationSettingKey), value);
     }
  }

  /// <summary>
  /// The value of the setting.
  /// </summary>
  public virtual string SettingValue
  {
     get;
     set;
  }
}



/// <summary>
/// Enumeration for all application settings.
/// </summary>
public enum ApplicationSettingKey
{
     WIDTH,
     HEIGHT,
     SHOWALL
}


/// <summary>
/// Returns the ApplicationSetting from the database that corresponds to 
/// the passed in key/name.
/// </summary>
/// <param name="aKey">The key/name of the Application setting to 
/// retrieve.</param>
/// <returns>The ApplicationSetting Definition that with the corresponding
/// application setting key/name.</returns>
public ApplicationSetting GetApplicationSettingByKey(ApplicationSettingKey aKey)
{
    const string propertyName = "theApplicationSettingString";
    string key = Enum.GetName(typeof(ApplicationSettingKey), aKey);
    DetachedCriteria criteria = DetachedCriteria.For<ApplicationSetting>();
    criteria.Add(Restrictions.Eq(propertyName, key));
    return FindFirst(criteria);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...