将数据库表(实体)中描述的Map添加到Hibernate的SessionFactory

7tofc5zh  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(131)

我正在将Hibernate4应用程序迁移到Hiberate5应用程序的过程中。该应用程序允许在实体中列出的通常列之外定义额外的列,这些列是用每个实体中的Map<String, Object>(称为additionalFields)建模的(键是字段/列的名称,而值是该字段/列的值)。
到目前为止,为了对此进行建模,我们有一个实体(让我们将其称为FieldDefinition),其中包含该Map的信息(字段的名称、类型、精度或最大长度(如果适用)等)。
因此,在创建SessionFactory之后,我们将使用它来获取session,访问FieldDefinition的所有示例,并通过configuration.getClassMapping(entityClassName)configuration.createMappings()和相关方法动态添加Map。
Configuration中的最后这些方法已经从Hibernate5中删除,因此我正在尝试解决这个问题。如果我理解正确的话,使用新的API,我需要:
1.创建一个了解FieldDefinitionSessionFactory
1.使用它访问并检索FieldDefinition%s。
1.有了这些实体的示例,创建第二个SessionFactory(因为SessionFactory是不可变的,所以我不能修改第一个),在创建过程中,我使用MetadataSources.addFile()(或.addInputStream())添加我需要基于FieldDefinition数据动态创建的hbm.xml文件,以将额外的列Map到additionalFieldsMap(我找不到像configuration.createMappings()那样的添加Map的编程方法)。
或者,如果我直接使用DataSource和JDBC,我可以跳过第一个SessionFactory创建,但其余部分保持不变。我找到了this other SO question which points to more or less the same。我在正确的轨道上吗,或者如果不是,对于这种情况,目前推荐的方法是什么?

nqwrtyyt

nqwrtyyt1#

您应该能够使用通过META-INF/services/org.hibernate.boot.spi.MetadataContributor文件注册的自定义org.hibernate.boot.spi.MetadataContributor来实现这一点,因为它是通过Java服务加载程序机制加载的。
在那里您可以访问PersistentClass,您可以在其中添加属性,同时您可以使用JdbcServics来查询表。

相关问题