使用Hibernate保持应用程序设置

时间:2010-06-23 19:34:53

标签: java hibernate orm

使用Hibernate存储应用程序设置的最佳/最漂亮/最灵活的方法是什么?

单行表是可行的,还是有更好的方法?能够在同一个地方/表中存储额外的设置,但在应用程序域之外是很好的。

我已尝试使用键/值表,例如:

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

但这似乎不适合Hibernate。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

我建议您根据值的使用方式组织域模型(类似于组织任何OO模型的方式),然后保留这些实体。对于您的示例,您将拥有一个Window对象,其中包含widthheightshowall属性,然后您可以将这些属性作为单个行/对象持久保存到数据库中。

这样你可以得到以下(假设情况):

id | layoutType | width | height | images
-----------------------------------------------
0  | widescreen | 1000  | 500    | true
1  | normal     | 600   | 500    | true
2  | mobile     | 320   | 480    | false 

答案 1 :(得分:2)

要严格回答您的问题,可以使用Hibernate映射键/值表:

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

    // getters, setters, etc
}

但是你是否真的需要将它存储在数据库中,我想我会选择Commons Configuration而不是Hibernate(或者如果你不喜欢只是一个Properties对象需要将设置保存在数据库中 {@ 3}} API,如@ring所示。

答案 2 :(得分:1)

我实际上是在C#中使用nHibernate将其作为键/值对实现的。该表与您仅使用键/值配对描述的表相同。当我想获取/设置一个值时,我的持久层接受“key”(作为枚举)并返回一个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);
}