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