使用Hibernate在J2EE App中存储全局数据的最佳实践

时间:2011-08-03 10:25:29

标签: java database hibernate java-ee orm

我正在寻找使用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会允许我这样做吗?

再次感谢

1 个答案:

答案 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

为了更加酷,您还可以在类中定义一个不会持久化的字段,您可以使用该字段将转换后的值保存在对象中。