We’ve been using Hibernate 1.2.x as a JMX service with JBoss to do our object persistence. We’ve not taking advantage of all its features, but it works very well.
Recently we needed a feature that we could get only with 2.x (update only changed fields), so I went ahead and bit the bullet to convert the application. It was a fairly easy task -- this document outlines most of the necessary changes. A couple more I'd add:
There is no Datastore object
I ran into this when translating our MBean. (We use this instead of the one shipped with Hibernate to work with the code generation system more smoothly.) Instead of defining a Datastore object and assigning the mapping files to it using storeResource and building the SessionFactory from it, you create a Configuration object to do much the same thing. So we used to have:
import cirrus.hibernate.Datastore;
import cirrus.hibernate.Environment;
import cirrus.hibernate.Hibernate;
...
public void startService()
{
...
// Define Properties object 'props' from information
// read from MBean configuration and elsewhere
Datastore ds = Hibernate.createDatastore();
String[] mappingFiles = getMapResources().split( ", " );
try
{
ClassLoader cl = Thread.currentThread.getContextClassLoader();
for ( int i = 0; i < mappingFiles.length; i++ )
{
ds.storeResource( mappingFiles[i], cl );
}
ds.buildSessionFactory( props );
...
Now it's:
import net.sf.hibernate.cfg.Configuration;
import net.sf.hibernate.cfg.Environment;
....
public void startService()
{
...
// Define Properties object 'props' from information
// read from MBean configuration and elsewhere
Configuration cfg = new Configuration();
String[] mappingFiles = getMapResources().split( ", " );
try
{
ClassLoader cl = Thread.currentThread().getContextClassLoader();
for ( int i = 0; i < mappingFiles.length; i++ )
{
cfg.addInputStream( cl.getResourceAsStream( mappingFiles[i] ) );
}
cfg.setProperties( props );
cfg.buildSessionFactory();
...
Not too much of a change. Note also that the Environment class moved to net.sf.hibernate.cfg.</b>
Change element in composite-id
You'll need to change the property element to a key-property element in any composite-id declarations. (For those of us using tables with multiple-field primary keys...)
Now: on to register the Interceptor so we can report which fields have changed in the object...