我正在寻找使用Hibernate存储Java EE应用程序全局数据的最佳解决方案。它将由键值对组成。例如:
projectStarted = "10-11-11"
developerNumber = 3
teamLeader = "John"
如您所见,所有这些条目都有不同的类型。
现在我看到两个选项:
1)创建GlobalData实体。它的每个字段将在表格中表示为唯一列,并包含唯一设置。这样我就没有类型转换的问题,但是如果有大量的设置,我想避免它。
2)创建设置实体。每个字段都包含两个字段:key(主键)和value,并将在表中表示为唯一记录。这是一个更好的解决方案,但在我看来,我会得到很多类型转换,因为设置可以是任何类型。
基本上,我正在寻找实现第二种解决方案的方法,而不会从不同类型中获得很多麻烦。有人能帮助我吗?
感谢。
修改1。
是的,谢谢Christian。刚刚有类似的想法。
如果我将设置实体,如下所示:
@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.
}
所以基本上我的想法是在持久化/更新/等之前转换设置实体。我可以在我的DAO中执行此操作,但我想知道,如果我可以使用@Entity注释来注释GlobalData类而不创建新表。这样我可以将OneToMany注释设置为Setting的设置,并在内部@PrePersist等方法中执行转换。
Hibernate会允许我这样做吗?
再次感谢
答案 0 :(得分:1)
您可以将Converter-Class存储到数据库中,并让它在使用该值之前通过给定的转换器运行属性。 JSF提供Converter 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;
}
如果你的模式有
name:String
value:String
转换器:类
那么你可以这样做: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
为了更加酷,您还可以在类中定义一个不会持久化的字段,您可以使用该字段将转换后的值保存在对象中。