Gastaldi's Blog

Mais um blog sobre Java …

Arquivos Mensais: abril 2011

JCP Member

Finalmente recebi a confirmação de registro no JCP (http://jcp.org). Com isso, posso criar JSRs, juntar-me a expert groups e enfim, envolver-me mais com a comunidade Java.

Pode conferir em http://jcp.org/en/participation/members/G.

Multi-Tenância no Hibernate

Se você já usou o Hibernate, sabe que ele é um framework poderoso para mapeamento objeto-relacional. Neste post apresento como podemos resolver de uma forma simples uma necessidade bastante comum: Acessar diversos bancos de dados com apenas um hibernate.cfg mapeado.

A solução para este problema depende na forma de como os dados são recuperados do seu database:

1) Se os bancos estiverem separados por conexões diferentes, crie uma classe que implemente a interface ConnectionProvider e configure no Hibernate.

2) Se o banco for gerenciado por apenas um pool de conexões, mas acessa dados de outros bancos a partir da mudança do SCHEMA, você pode utilizar um Interceptor para isso:

import static org.apache.commons.lang.StringUtils.defaultIfEmpty;

import java.util.regex.Pattern;
import org.hibernate.EmptyInterceptor;

/**
 * Interceptor para alterar SCHEMA dinamicamente
 * 
 * @author george
 * 
 */
public class SchemaReplaceInterceptor extends EmptyInterceptor {

	private static final long serialVersionUID = 1L;
	private Pattern pattern;

	private String defaultSchema;

	public SchemaReplaceInterceptor(String token, String defaultSchema) {
		pattern = Pattern.compile(token);
		this.defaultSchema = defaultSchema;
	}

	@Override
	public String onPrepareStatement(String sql) {
		String novoSchema = recuperaNomeSchema();
		String novoSQL = pattern.matcher(sql).replaceAll(novoSchema);
		return super.onPrepareStatement(novoSQL);
	}

	protected String recuperaNomeSchema() {
             //TODO: Implementar - Recuperar de um ThreadLocal 
	}
}