Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Hibernate持久化应用程序设置_Java_Hibernate_Orm - Fatal编程技术网

Java 使用Hibernate持久化应用程序设置

Java 使用Hibernate持久化应用程序设置,java,hibernate,orm,Java,Hibernate,Orm,使用Hibernate存储应用程序设置的最佳/最漂亮/最灵活的方法是什么 单排桌子是最好的选择,还是有更好的选择?能够在同一个位置/表中存储额外的设置,但不在应用程序域中就更好了 我尝试过一个键/值表,例如: Key | Value ------------------------- width | 20px height | 40px showall | true etc. 但这似乎不太适合Hibernate 有什么想法吗?我建议您根据值的使用方式来组织域模型(类似于您

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

单排桌子是最好的选择,还是有更好的选择?能够在同一个位置/表中存储额外的设置,但不在应用程序域中就更好了

我尝试过一个键/值表,例如:

Key      | Value
-------------------------
width    | 20px
height   | 40px
showall  | true
etc.
但这似乎不太适合Hibernate


有什么想法吗?

我建议您根据值的使用方式来组织域模型(类似于您组织任何OO模型的方式),然后持久化这些实体。例如,您将有一个
窗口
对象,该对象具有
宽度
高度
、和
显示所有属性,然后将其作为一行/对象保存到数据库中

通过这种方式,您可能会遇到以下情况(假设情况):


实际上,我已经用nHibernate在C#中实现了一个键/值对。该表与您描述的相同,只是一个键/值配对。当我想要获取/设置一个值时,我的持久层接受“键”(作为枚举)并返回一个ApplicationSetting对象。这个对象实际上只是键/值对的包装器

简单示例(用c#)表示):

类应用程序设置
{
私有字符串applicationsettingstring=string.Empty;
/// 
///设置的名称。
/// 
公共虚拟应用程序设置密钥设置名称
{
//我在这里使用枚举,这样我就可以保证得到一个密钥
//已经知道,而不是随机字符串。
得到
{
返回(ApplicationSettingKey)Enum.Parse(
类型(应用程序设置键),应用程序设置字符串);
}
设置
{
应用程序设置字符串=
GetName(typeof(ApplicationSettingKey),value);
}
}
/// 
///设置的值。
/// 
公共虚拟字符串设置值
{
得到;
设置
}
}
/// 
///所有应用程序设置的枚举。
/// 
公共枚举应用程序设置密钥
{
宽度,
高度,
SHOWALL
}
/// 
///从对应于的数据库返回应用程序设置
///传入的键/名称。
/// 
///要设置的应用程序设置的键/名称
///找回。
///具有相应
///应用程序设置键/名称。
公共应用程序设置GetApplicationSettingByKey(应用程序设置密钥aKey)
{
const string propertyName=“应用程序设置字符串”;
string key=Enum.GetName(typeof(ApplicationSettingKey),aKey);
DetachedCriteria=DetachedCriteria.For();
添加(Restrictions.Eq(propertyName,key));
返回FindFirst(标准);
}

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

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

    // getters, setters, etc
}

但是,无论您是否真的需要将其存储在数据库中,我想我会选择Hibernate而不是Hibernate(或者如果您不需要在数据库中使用@ring建议的API来分配设置,那么可能只是一个
Properties
对象)。

是否真的需要将这些存储在SQL数据库中?您是否会将此数据加入其他数据,从其他应用程序中查询数据,等等?或者它只是存储它最方便的地方吗?在大多数情况下,我会说不。但在这种情况下,我使用的是两个不同的应用程序(在不同的机器上),它们都在同一个数据库上工作。相反,基于
java.util.Preferences
的APIsI最终使用了这种方法,但是我建议任何人在做决定之前,阅读本文来评估所有其他建议的解决方案以及任何其他现有的技术。@Kristofer我完全同意其他人应该看看所有的解决方案。为我的项目选择此解决方案是因为它非常适合项目的其他部分。将任何类型保存为字符串是一种容易出错的方法。最好使用ORM正确映射类型的能力。因此,我建议为每个设置键创建具有适当类型的单独列。显然,您应该防止创建多个设置行。
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);
}
@Entity
public class Settings {
    @Id
    private String key;
    private String value;

    // getters, setters, etc
}