Well, I think it is the first time in Hibernate’s history that it is released with incomplete feature implementations and
documentation. I came to this conclusion when I see Configuration.buildSessionFactory() method as deprecated.
When I look at the documentation, however, it still uses the above method to create it! If you look at the
org.hibernate.cfg.Configuration class, it is stated that the configuration mechanism of Hibernate will be replaced with
ServiceRegistryBuilder and MetadataSources classes after 4.0, so Configuration is made “deprecated” and will be
removed in Hibernate 5. On 22nd May, Hibernate 4.2.2 is released, but there is still no example of how to build
SessionFactory with the new way in its own documentation!
OK, I didn’t stop at that point and tried to configure it with the new way by googling around and find some examples which are also given by Hibernate’s team members like below;
ServiceRegistry registry = new ServiceRegistryBuilder().configure().buildServiceRegistry();
sessionFactory = new MetadataSources(registry)
.addAnnotatedClass(Foo.class).buildMetadata()
.buildSessionFactory();
However, I realized that hibernate.cfg.xml has switched from DTD to XSD, and we have to update its header to reflect
this. Still, same story, there is no mention of this change in the documentation. Anyway, I changed configuration file
as follows and continued with my trials.
<?xml version="1.0" encoding="UTF-8"?>
<hibernate-configuration
xmlns="http://www.hibernate.org/xsd/hibernate-configuration"
xsi:schemaLocation="http://www.hibernate.org/xsd/hibernate-configuration hibernate-configuration-4.0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<session-factory>
...
</session-factory>
</hibernate-configuration>
After this change I tried again but came up with the following error!
Caused by: java.lang.NullPointerException
at org.hibernate.persister.entity.AbstractEntityPersister.initSubclassPropertyAliasesMap(AbstractEntityPersister.java:2285)
at org.hibernate.persister.entity.SingleTableEntityPersister.(SingleTableEntityPersister.java:711)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
My Entity class is super simple, only containing a “synthetic id” in it.
package examples.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Foo {
@Id
@GeneratedValue
private Long id;
}
Error point indicates that Hibernate is unable to identify type of entity’s identifier attribute. At this point, I reverted to old configuration and saw that it works without any problem!
There are some other examples with both use Configutation.configure() and then build SessionFactory with the new approach
like below;
Configuration cfg = new Configuration();
cfg.configure();
sessionFactory = cfg.buildSessionFactory(new ServiceRegistryBuilder()
.applySettings(cfg.getProperties()).buildServiceRegistry());
Be careful that you won’t forget to call applySettings(cfg.getProperties()), otherwise your property definitions in
hibernate.cfg.xml won’t override definitions in hibernate.properties! Still discovered with trial and error.
Unfortunately, you cannot register Hibernate event listeners via hibernate.cfg.xml anymore. In order to register them,
you first need to create an org.hibernate.integrator.spi.Integrator implementation like below:
public class TestIntegrator implements Integrator {
@Override
public void integrate(Configuration configuration,
SessionFactoryImplementor sessionFactory,
SessionFactoryServiceRegistry serviceRegistry) {
EventListenerRegistry service = serviceRegistry.getService(org.hibernate.event.service.spi.EventListenerRegistry.class);
service.appendListeners(EventType.LOAD, TestLoadListener.class);
}
//...
}
Then you will create a file called org.hibernate.integrator.spi.Integrator in the /META-INF/services folder and put
the FQN of your Integrator implementation class inside it. You can put more than one line; each will be a different
Integrator class.
As a result, it is better to keep using the old approach in order to build SessionFactory until the new configuration
approach is completely ready to use.