使用Hibernate存储应用程序设置的最佳/最漂亮/最灵活的方法是什么?
单行表是可行的,还是有更好的方法?能够在同一个地方/表中存储额外的设置,但在应用程序域之外是很好的。
我已尝试使用键/值表,例如:
Key | Value
-------------------------
width | 20px
height | 40px
showall | true
etc.
但这似乎不适合Hibernate。
有什么想法吗?
答案 0 :(得分:2)
我建议您根据值的使用方式组织域模型(类似于组织任何OO模型的方式),然后保留这些实体。对于您的示例,您将拥有一个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 :(得分:2)
要严格回答您的问题,可以使用Hibernate映射键/值表:
@Entity
public class Settings {
@Id
private String key;
private String value;
// getters, setters, etc
}
但是你是否真的需要将它存储在数据库中,我想我会选择Commons Configuration而不是Hibernate(或者如果你不喜欢只是一个 {@ 3}} API,如@ring所示。Properties
对象需要将设置保存在数据库中
答案 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);
}