Hibernate是否支持在运行时混合实体模式?

时间:2012-12-19 01:46:13

标签: hibernate hibernate-mapping

只是想知道Hibernate是否支持实体中静态属性和动态属性的组合。例如

public class User
{  
  private Long id;  
  private String first_name;  
  private String last_name;  
  private Map<String,Object> dynamicProperties;  
}

我可以通过在运行时从Db读取User表的元数据来获取动态属性。 基本上我正在研究支持多个客户的产品。

对于一个客户端,用户表只能包含idfirst_namelast_name等列,而另一个客户端用户表需要存储两个添加列,如DOB和{ {1}}。

Titleidfirst_name视为所有客户端中的常用属性集,我将其用作静态属性,其余我打算将其存储为实体中的地图。不确定死于hibernate是否支持此功能。

约束是代码只在运行时知道动态属性列。

2 个答案:

答案 0 :(得分:0)

我认为你需要研究你的映射策略。在休眠中,您希望您的架构是静态的。我建议将dynamicProperties重命名为metaData,并使map具有字符串键和字符串值,然后将其作为hibernate映射文件中的映射属性包含在内。在映射的hibernate中具有通用对象值的映射没有意义。另一种选择是将该地图标记为@transient,但我认为第一个建议更有意义。您需要特定于客户端的元数据,因此将其映射为架构的一部分。

答案 1 :(得分:0)

我正在研究的项目正是这样做的(动态的,每个客户端模型)。但是,我们不会尝试在同一行上混合使用静态(基于类)和动态实体。通过将模型的静态部分与动态部分分离,并使用EntityMode.MAP entites将静态与类和动态部分映射,您可以轻松地执行所需操作。我已经提交了patch for Hibernate 4.1,允许您对EntityMode.MAP使用JPA条件查询。这使得动态查询生成更加简单。