Home > front end >  Adding mappings described in a database table (entity) to Hibernate's SessionFactory
Adding mappings described in a database table (entity) to Hibernate's SessionFactory

Time:10-01

I'm in the process of migrating a Hibernate 4 application into a Hibernate 5 one. The application allows the possiblity of defining additional columns outside of the usual ones listed in an entity, which are modelled with a Map<String, Object> (call it additionalFields) in each entity (the key is the name of a field/column, while the value that field/column's value).

To model this so far we've had an entity (let's call it FieldDefinition) which contains the information of this mapping (the name of the field, the type, the precision or maximum length if that applies, etc.)

So, after creating the SessionFactory, we would use it to obtain a session, access all instances of FieldDefinition and add the mappings dynamically through configuration.getClassMapping(entityClassName), configuration.createMappings(), and related methods.

These last methods in Configuration have been removed from Hibernate 5, hence the problem I'm trying to solve. If I understand correctly, with the new API I would need to:

  1. Create a SessionFactory that understands about FieldDefinition.
  2. Use it to access it and retrieve the FieldDefinitions.
  3. Having the instances of these entities, create a second SessionFactory (because SessionFactory is immutable, so I cannot modify the first one), where during the creation I use the MetadataSources.addFile() (or .addInputStream()) to add hbm.xml files I need to create on the fly based on the FieldDefinition data to map the additional columns to the additionalFields maps (I couldn't find a programmatic way of adding mappings as was the case with configuration.createMappings()).

Alternatively, I can skip the first SessionFactory creation if I use the DataSource and JDBC directly, but the rest stays the same. I found this other SO question which points to more or less the same. Am I on the right track, or if not, what's the current recommended approach for such a case?

CodePudding user response:

You should be able to do this with a custom org.hibernate.boot.spi.MetadataContributor that is registered via a META-INF/services/org.hibernate.boot.spi.MetadataContributor file, since it is loaded through the java service loader mechanism.

There you have access to the PersistentClass where you can add you attributes, and at the same time you can make use of JdbcServics which you can use to query a table.

  • Related