read

While upgrading one of our Grails 2 applications at Good Start Genetics to Grails 3.2.3 we found that the latest version of the Grails Hibernate Filters plugin was no longer functional. This ended up being due to the fact that Grails 3.2.x ships with Hibernate 5 which removed/moved many of the integration patterns available in Hibernate 4.

TLDR; The code and plugin

Just want to take a look at how the plugin integrates with Hibernate 5 and GORM 6 or interested in using this version of the plugin in your application? Well no need to read any further. Head over to GitHub to check out the source, usage, and installation instructions.

The requirements

Create and register metadata for filter definitions as well as add the filters to the entities and collections as per user defined settings on the Grails domain objects. Since hibernate will not enable a filter by default, the plugin also needs to provide the ability to apply user defined default filters to all sessions.

How it worked: Hibernate 4

The hibernate configuration object was widely accessible and had methods to inspect and inject metadata. The plugin extended the Grails extension of the hibernate configuration and injected the filter definitions and entity/collection level filters during the second pass compile. It then applied the default filters to the session using a Grails interceptor.

How it works: Hibernate 5

You can add your metadata by creating a class that implements the MetadataContributor interface. The one method that you implement (contribute) allows you access to the InFlightMetadataCollector. You can add your metadata directly to the collector in your implementation of the contribute method or you can register a SecondPass object which the collector will invoke later after all of the first pass metadata has been collected. Since our filters need to be applied after all of the entities and collections are registered, our implementation of contribute simply registers a single SecondPass object. Finally we needed to make hibernate aware of our MetadataContributor so we extended the Grails HibernateConnectionSourceFactory and wired up our contributor in the factory constructor. We explored alternatives for applying the default filters but ended up leaving the interceptor. Reason being, all methods we found to apply them would mean that we would potentially not play nice with other plugins that wanted to extend the Grails hibernate functionality.

Blog Logo

Alex Kramer


Published

Comments

Image

Alex Kramer

Ruminations of a soccer playing software engineer

Back to Overview