Hibernate Shards

Boa tarde pessoal,
estou tentando aprender sobre Hibernate Shards e achei um exemplo neste link:
http://www.site.lalitbhatt.com/hibernate-shards

Baixei o exemplo:
Vejam as classes:

package com.lalit.shards;

import java.io.Serializable;
import java.math.BigInteger;
import java.util.Objects;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.hibernate.annotations.GenericGenerator;
import com.lalit.shards.EmailUser;

/**
 *
 * @author wellington
 */
@Entity
public class EmailUser implements Serializable {
	@Id 
        @GeneratedValue(generator="EmailIdGenerator")
	//@GenericGenerator(name="EmailIdGenerator", strategy="org.hibernate.shards.id.ShardedUUIDGenerator")
        @GenericGenerator(name="EmailIdGenerator", strategy="org.hibernate.id.UUIDGenerator")
	@Column(name="ID")
	private BigInteger id;
	
	
	private String name;
	
	private String continent;
	
	
	public BigInteger getId() {
		return id;
	}
	
	public void setId(BigInteger id) {
		this.id = id;
	}


	

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getContinent() {
		return continent;
	}

	public void setContinent(String continent) {
		this.continent = continent;
	}

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 41 * hash + Objects.hashCode(this.id);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final EmailUser other = (EmailUser) obj;
        if (!Objects.equals(this.id, other.id)) {
            return false;
        }
        return true;
    }
}
package com.lalit.shards;

import org.hibernate.shards.ShardId;
import org.hibernate.shards.strategy.selection.ShardSelectionStrategy;




public class EmailUserShardSelectionStrategy implements ShardSelectionStrategy {
    @Override
	public ShardId selectShardIdForNewObject(Object obj) {
		if (obj instanceof EmailUser) {
			//return ((EmailUser) obj).getContinent().getShardId();
			return new ShardId(0);
		}
		throw new IllegalArgumentException();
	}
}
import com.lalit.shards.*;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.shards.ShardId;
import org.hibernate.shards.ShardedConfiguration;
import org.hibernate.shards.cfg.ConfigurationToShardConfigurationAdapter;
import org.hibernate.shards.cfg.ShardConfiguration;
import org.hibernate.shards.loadbalance.RoundRobinShardLoadBalancer;
import org.hibernate.shards.strategy.ShardStrategy;
import org.hibernate.shards.strategy.ShardStrategyFactory;
import org.hibernate.shards.strategy.ShardStrategyImpl;
import org.hibernate.shards.strategy.access.SequentialShardAccessStrategy;
import org.hibernate.shards.strategy.access.ShardAccessStrategy;
import org.hibernate.shards.strategy.resolution.AllShardsShardResolutionStrategy;
import org.hibernate.shards.strategy.resolution.ShardResolutionStrategy;
import org.hibernate.shards.strategy.selection.RoundRobinShardSelectionStrategy;
import org.hibernate.shards.strategy.selection.ShardSelectionStrategy;

/**
 * The class to boot strap the hibernate if it is not started.
 *
 * @author lalit
 *
 */
public class HibernateUtil {

    private static SessionFactory sessionFactory;

    static {
        try {
            //By default it will look for hibernate.cfg.xml in the class path
            AnnotationConfiguration prototypeConfig = new AnnotationConfiguration().configure("hibernate0.cfg.xml");
            prototypeConfig.addAnnotatedClass(EmailUser.class);
            List<ShardConfiguration> shardConfigs = new ArrayList<>();
            shardConfigs.add(buildShardConfig("hibernate0.cfg.xml"));
            shardConfigs.add(buildShardConfig("hibernate1.cfg.xml"));
            ShardStrategyFactory shardStrategyFactory = buildShardStrategyFactory();
            ShardedConfiguration shardedConfig = new ShardedConfiguration(
                    prototypeConfig,
                    shardConfigs,
                    shardStrategyFactory);
            sessionFactory = shardedConfig.buildShardedSessionFactory();
        } catch (Throwable ex) {
            System.out.println("Erro: " + ex.getMessage());
            //throw new ExceptionInInitializerError(ex);

        }
    }

    static ShardConfiguration buildShardConfig(String configFile) {
        Configuration config = new Configuration().configure(configFile);
        return new ConfigurationToShardConfigurationAdapter(config);
    }

    static ShardStrategyFactory buildShardStrategyFactory() {
        ShardStrategyFactory shardStrategyFactory =
                new ShardStrategyFactory() {
                    @Override
                    public ShardStrategy newShardStrategy(List<ShardId> shardIds) {
                        RoundRobinShardLoadBalancer loadBalancer =
                                new RoundRobinShardLoadBalancer(shardIds);
                        ShardSelectionStrategy shardSelection =
                                new RoundRobinShardSelectionStrategy(loadBalancer);
                        ShardResolutionStrategy shardResoultion =
                                new AllShardsShardResolutionStrategy(shardIds);
                        ShardAccessStrategy shardAccess =
                                new SequentialShardAccessStrategy();
                        return new ShardStrategyImpl(shardSelection,
                                shardResoultion,
                                shardAccess);
                    }
                };
        return shardStrategyFactory;
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public static void shutdown() {
        //Close caches and connection pool
        getSessionFactory().close();
    }
}
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import com.lalit.shards.EmailUser;




public class HibernateShardsMain {
	
	public static void main(String[] args){
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction tx= session.beginTransaction();
		
		EmailUser e1= new EmailUser();
		e1.setName("abc");
		e1.setContinent("North America");
		System.out.println(session.save(e1));
		
		EmailUser e2= new EmailUser();
		e2.setName("def");
		e2.setContinent("Asia");
		System.out.println(session.save(e2));
		
		EmailUser e3= new EmailUser();
		e3.setName("fgh");
		e3.setContinent("Asia");
		System.out.println(session.save(e3));
		
		EmailUser e4= new EmailUser();
		e4.setName("ijk");
		e4.setContinent("North America");
		System.out.println(session.save(e4));
	
		
		
		tx.commit();
		session.close();
		
		session = HibernateUtil.getSessionFactory().openSession();
		tx= session.beginTransaction();
		
		Criteria crit = session.createCriteria(EmailUser.class);
		crit.add(Restrictions.ilike("continent", "North America"));
		crit.list();
		   
		tx.commit();
		session.close();
	}
}

Configurações

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory name="HibernateSessionFactory0"> <!-- note the different name -->
		<!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/sass0</property>
        <property name="connection.username">root</property>
        <property name="connection.password">xxxx</property>
        
        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
        <!--  property name="format_sql">true</property -->
        <!-- property name="use_sql_comments">true</property -->

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">create-drop</property>
        
		<property name="hibernate.connection.shard_id">0</property> 
		<property name="hibernate.shard.enable_cross_shard_relationship_checks">true</property>
<mapping class="com.lalit.shards.EmailUser"/>
	</session-factory>
</hibernate-configuration>
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory name="HibernateSessionFactory0"> <!-- note the different name -->
		<!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/sass1</property>
        <property name="connection.username">root</property>
        <property name="connection.password">xxxx</property>
        
        
        <!-- SQL dialect - This tells the SQL grammer to be used -->
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        
		<property name="hibernate.connection.shard_id">1</property> 
		<property name="hibernate.shard.enable_cross_shard_relationship_checks">true</property>
<mapping class="com.lalit.shards.EmailUser"/>
	</session-factory>
</hibernate-configuration>

E recebo o seguinte erro quando rodo a a classe HibernateShardsMain:

16:03:39,947 INFO [main] TransactionFactoryInitiator:68 - HHH000399: Using default transaction strategy (direct JDBC transactions)
16:03:39,971 INFO [main] ASTQueryTranslatorFactory:48 - HHH000397: Using ASTQueryTranslatorFactory
16:03:40,324 INFO [main] Version:27 - HV000001: Hibernate Validator 4.3.0.Final
Erro: Could not instantiate id generator [entity-name=com.lalit.shards.EmailUser]
Exception in thread “main” java.lang.NullPointerException
at HibernateShardsMain.main(HibernateShardsMain.java:14)
Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 10 segundos)

Andei procurando no Oráculo Google mas não encontrei. Alguém pode me ajudar?

Agradeço desde já,

Wellington