【问题标题】:Can Hibernate be used to store HashMaps of data without classes to represent their structure?Hibernate 可以用来存储没有类的数据的 HashMap 来表示它们的结构吗?
【发布时间】:2012-12-06 10:59:48
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java database hibernate


    【解决方案1】:

    您可以配置 hibernate 在没有任何实体类(链接到表的 bean)的情况下工作, 1.您需要为此使用xml配置。代替class 使用entity-name 代替<property name="something" 使用<property node="something"

    1. 使用 entiy-mode 作为映射创建一个休眠会话。

    您可以使用地图来存储和检索数据库中的信息。请记住,由于您使用的是 map,因此 2-way mapping 会有困难(这是 3.3 的版本,不确定是否在以后的版本中修复)

    【讨论】:

      【解决方案2】:

      我不相信 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 表示的任何对象。

      【讨论】:

      • 我正在创建一个库,所以我需要它能够使用尽可能多的后端——使其与 SQL 数据库和对象数据库兼容是理想的,但可能是一个很长的目标。我要避免的是任何类型的编译文件;我需要能够动态定义模型,而无需重新编译应用程序。使用地图作为字段并不会削减它。 Hibernate 可能不是这里工作的正确工具(这就是我想要找出的),我只需要一个良好、稳定的与数据库无关的后端,因此我不必编写相同 SQL 的许多不同版本。
      【解决方案3】:

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

      @javax.persistence.OneToMany(cascade = CascadeType.ALL)
      @javax.persistence.MapKey(name = "name")
      private Map<String, Configuration> configurationMap = new HashMap<String, Configuration>();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多