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