Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate在运行时支持混合实体模式吗?_Hibernate_Hibernate Mapping - Fatal编程技术网

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

Hibernate在运行时支持混合实体模式吗?,hibernate,hibernate-mapping,Hibernate,Hibernate Mapping,只是想知道Hibernate是否支持实体中静态属性和动态属性的组合。比如说 public class User { private Long id; private String first_name; private String last_name; private Map<String,Object> dynamicProperties; } 公共类用户 { 私人长id; 私有字符串名; 私有字符串姓氏; 私有财产; } 我可以通过在

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

public class User
{  
  private Long id;  
  private String first_name;  
  private String last_name;  
  private Map<String,Object> dynamicProperties;  
}
公共类用户
{  
私人长id;
私有字符串名;
私有字符串姓氏;
私有财产;
}
我可以通过在运行时从数据库中读取用户表的元数据来获取动态属性。 基本上,我正在开发一个支持多个客户端的产品

对于一个客户机,用户表只能有
id
first\u name
last\u name
等列,而对于另一个客户机,用户表需要存储两个附加列,如
DOB
Title

考虑到
id
first\u name
last\u name
是所有客户端中的公共属性集,我将它们用作静态属性,其余部分则计划作为映射存储在实体中。不确定hibernate是否支持这一点


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

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

我正在从事的项目正是这样做的(动态的、每个客户机的模型)。但是,我们不尝试在同一行上混合静态(基于类)和动态实体。通过将模型的静态部分与动态部分分离,并使用类映射静态部分,使用EntityMode.map entites映射动态部分,您可以轻松完成所需的工作。我已经提交了一个允许您在EntityMode.MAP中使用JPA标准查询的。这使得动态查询生成更加简单

这是你的问题的一部分,我不理解“约束是代码只知道运行时的动态属性列”,对我来说,这似乎是一个瞬态属性。我不明白为什么需要约束Hanks Duncan。让我进一步解释我的问题。我正在开发一款支持多个组织作为客户的产品。一个组织的员工定义可以有3个字段,如id、firstName、lastName,而另一个组织的员工定义可以有5个字段,如id、firstName、lastName、出生日期、称呼等。为了支持这些变化,我使用Employee的公共属性作为对象的属性,并将特定于客户端的属性存储在名为dynamicProperties的映射中。因此,基本上,每当新客户机出现时,代码都会从数据库中读取元数据。请详细解释“来自数据库的元数据”,对于所有客户机,您都坚持使用一种模式,对吗?对于像CustomProperty这样的对象,它有一个id和一个字符串值,以及一个可以在运行时强制转换的数据类型常量。然后我想您可以为该元数据编写一个自定义查询方法。但是每个客户端都有相同的模式,对吗。实际上,我的中间件将为不同的客户机支持不同的模式,为每个客户机使用Sperate DB实例,以避免数据混合。考虑一下,我的中间件应用支持使用MaSQL数据库的BAISC模式的客户端A,10天后我们计划将另一个客户机B带到具有Oracle DB的扩展模式。查看我之前的评论,了解我所说的扩展模式是什么意思。所以基本上,这些模式在基本实体级别上略有不同。这听起来很可怕,必须有一种方法为所有客户端保留一个模式,并在模式中容纳元数据。你最终会得到所有这些不同的模式,并且会有100个客户!