Gastaldi's Blog

Mais um blog sobre Java …

Arquivos de tags: interceptor

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 
	}
}