9

尽管我以前在其他语言中使用过类似的持久性库,但我对 Hibernate 的经验几乎为零。我正在开发一个 Java 项目,该项目需要一种方法来在文本配置文件中定义“模型”(在 MVC 意义上),自动生成数据库表,并且(理想情况下)与数据库后端无关。据我通过一些快速的谷歌搜索得知,Hibernate 是唯一广泛使用的与后端无关的 Java 数据库库。虽然我可以在我的模型系统和多个数据库后端之间编写自己的兼容层,但如果可能的话,我希望避免这种调试工作。

我的问题是:Hibernate 是否可以用于存储其结构以其他方式表示的数据,而不是带注释的 Java 类文件,例如带有一些描述其结构的配置对象的 HashMap?如果没有,是否还有其他相对稳定的 Java 数据库库可以提供此功能?

编辑:这是我想要完成的更清晰的描述:

我正在编写一个数据建模库。当调用库的某个方法并传递配置对象(从文本文件加载)时,它应该创建一个新的“模型”,并在必要时为该模型创建一个数据库表。可以在库中查询此模型的项目,该模型应返回包含模型字段的 HashMap。它还应该允许将 HashMap 保存到数据库中,前提是它们的结构与配置文件匹配。这些模型都不应该由实际编译的 Java 类来表示。

4

3 回答 3

4

我认为您可以尝试使用 JPA 提供的 @MapKey 注释(不是 Hibernate @MapKey 注释,它完全不同!)。

@javax.persistence.OneToMany(cascade = CascadeType.ALL)
@javax.persistence.MapKey(name = "name")
private Map<String, Configuration> configurationMap = new HashMap<String, Configuration>();
于 2012-12-19T06:26:00.397 回答
1

我不相信 Hibernate 会让你拥有一个 Map 作为 @Entity 但它会让你拥有一个包含地图字段的自定义类:

@Entity
public class Customer {
    @Id @GeneratedValue public Integer getId() { return id; }
    public void setId(Integer id) { this.id = id; }
    private Integer id;

    @OneToMany @JoinTable(name="Cust_Order")
    @MapKeyColumn(name"orders_number")
    public Map<String,Order> getOrders() { return orders; }
    public void setOrders(Map<String,Order> orders) { this.orders = orders; }
    private Map<String,Order> orders;
}

(来自 Hibernate 文档的示例)

此外,您不必使用注释(如果这是您想要避免的):Hibernate 关系可以通过 xml 文件描述,并且有一些实用程序(例如 maven 插件)可以自动生成必要的 java pojo xml。

您的模型是否需要关系数据库?您可能会考虑使用像 Mongo 这样的数据库来存储您可以用 JSON 表示的任何对象。

于 2012-12-19T06:27:13.887 回答
0

you can configure hibernate to work without any entity classes (beans linked to tables), 1. you need to use xml configuration for this. in place of class use entity-name and in place of <property name="something" use <property node="something".

  1. create a hibernate session with entiy-mode as map.

you can use a map to store and retuive information from db. Remember, since you are using map there will be difficulties in 2-way mapping (this was as of 3.3, not sure if its been fixed in later releses)

于 2012-12-19T06:32:58.177 回答