Java Hibernate可以用来存储数据的HashMap,而不用类来表示它们的结构吗?

Java Hibernate可以用来存储数据的HashMap,而不用类来表示它们的结构吗?,java,database,hibernate,Java,Database,Hibernate,我几乎没有使用Hibernate的经验,尽管我以前在其他语言中使用过类似的持久性库。我正在从事一个Java项目,该项目需要一种在文本配置文件中定义“模型”(MVC意义上)的方法,自动生成数据库表,并且(理想情况下)不依赖于数据库后端。从一些快速的谷歌搜索中我可以看出,Hibernate是唯一被广泛使用的后端不可知Java数据库库;虽然我可以在我的模型系统和多个DB后端之间编写自己的兼容层,但如果可能的话,这是我希望避免的调试工作 我的问题是:Hibernate是否可以用来存储数据,这些数据的结构

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

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

编辑:以下是我试图实现的目标的更清晰描述:


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

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

@javax.persistence.OneToMany(cascade=CascadeType.ALL)
@javax.persistence.MapKey(name=“name”)
private Map configurationMap=新HashMap();

我不相信Hibernate会让您拥有一个作为@实体的映射,但它会让您拥有一个包含映射字段的自定义类:

@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;
}
@实体
公共类客户{
@Id@GeneratedValue公共整数getId(){return Id;}
public void setId(整数id){this.id=id;}
私有整数id;
@OneToMany@JoinTable(name=“客户订单”)
@MapKeyColumn(名称“订单号”)
公共映射getOrders(){return orders;}
public void setOrders(映射顺序){this.orders=orders;}
私人地图订单;
}
(来自Hibernate文档的示例)

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


您的模型需要关系数据库吗?您可以考虑像Mango这样的数据库,它可以用JSON存储任何可以表示的对象。

< P>可以配置Hibernate以在没有任何实体类(bean链接到表)的情况下工作,
1.您需要为此使用xml配置。代替
使用
实体名称
,我正在创建一个库,因此我需要它能够使用尽可能多的后端——使其与SQL数据库和对象数据库兼容将是理想的,但可能需要很长时间。我试图避免的是任何类型的编译文件;我需要能够动态定义模型,而无需重新编译应用程序。使用地图作为场并不能切割它。Hibernate可能不是适合这项工作的工具(这正是我想要找到的),我只需要一个好的、稳定的数据库无关后端,这样我就不必为同一个SQL编写许多不同的版本。
@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;
}