Opa, eu nunca me dei bem com XML… não sei se é trauma da época que trabalhava com html(abre tag, fecha tag, abre tag…) ou se é algum outro tipo de bloqueio.
E no caso usando hibernate+Annotations achei muito chato ficar alterando este XML para mapear as classes. Além de engessar caso eu queira configurar um nova conexão em tempo de execução.
Isto é mais um exemplo… futuramente (eu ando prometendo muitas coisas
) posto aqui um projeto utilizando ele.
No caso aqui eu uso duas classes Banco e BancoProjeto, como são vários projetos herdo e personalizo de acordo com a necessidade de cada projeto.
Primeira classe: Banco
package br.com.theos.admin.database;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
public class Banco {
protected static Banco instancia;
private Session session;
private Transaction transaction;
private AnnotationConfiguration cfg;
public synchronized static Banco getInstancia() {
if (instancia == null) {
instancia = new Banco();
}
return instancia;
}
public Banco() {
super();
cfg = new AnnotationConfiguration();
}
public void setProperty(String key, String value) {
cfg.setProperty(key, value);
}
@SuppressWarnings("unchecked")
public void addMappedClass(Class persistenceClass) {
cfg.addAnnotatedClass(persistenceClass);
}
public Session getSession() {
if (session == null) {
session = cfg.buildSessionFactory().openSession();
}
return session;
}
public void startTransaction() {
transaction = session.beginTransaction();
}
public void commitTransaction() {
transaction.commit();
}
public void rollbackTransaction() {
transaction.rollback();
}
}
Ela apenas está preparada para receber as configurações e serviços básicos. É necessário herdá-la para que seja possível a conexão.
Segunda classe: BancoProjeto
package br.com.theos.server.database;
import br.com.theos.admin.database.Banco;
import br.com.theos.server.database.entities.Class1;
import br.com.theos.server.database.entities.Class2;
import br.com.theos.server.database.entities.Class3;
public class BancoProjeto extends Banco {
public BancoProjeto(String database) {
super();
loadBuild(database);
loadMappedClass();
}
public synchronized static Banco getInstancia(String database) {
if (instancia == null) {
instancia = new BancoProjeto(database);
}
return instancia;
}
private void loadBuild(String database) {
setProperty("hibernate.dialect", "org.hibernate.dialect.FirebirdDialect");
setProperty("hibernate.connection.driver_class", "org.firebirdsql.jdbc.FBDriver");
setProperty("hibernate.connection.url", "jdbc:firebirdsql:localhost/3050:"+database);
setProperty("hibernate.connection.username", "sysdba");
setProperty("hibernate.connection.password", "masterkey");
setProperty("hibernate.show_sql", "false");
/*
* Para apagar e recriar: "create-drop"
* Para não fazer nada: "validate"
* Para somente atualizar: "update"
*/
setProperty("hibernate.hbm2ddl.auto", "validate");
}
private void loadMappedClass() {
addMappedClass(Class1.class);
addMappedClass(Class2.class);
addMappedClass(Class3.class);
}
}
Pronto! Agora abandonamos o persistence.xml e o hibernate.cfg.xml.
Isto vai dar uma dinamicidade melhor ao seu projeto.