Tenho a mania de trocar poder por simplicidade. As vezes isso me ajuda, as vezes atrapalha. Mas uma coisa eu não tenho dúvida: Aumenta e muito a produtividade!
A complexidade e o receituário de EJB me deprimem.
Hibernate eu não conheço muito ainda, mas já dei uma olhada e achei legal. Entretanto eu tenho uma outra mania que é não gostar de arquivos de configuração, principalmente arquivos XML. Será que um dia haverá programadores que não precisam programar, mas apenas configurar arquivos XML ??? Essa idéia não me agrada e embora um arquivo de configuração XML traga flexibilidade eles acabam cortando o meu prazer de programar.
Então para a minha camada de persistência (Objetos -> DB) eu resolvi escrever meu próprio framework o mais simples possível e sem arquivos de configuração.
Apesar de simples, ele fornece o indispensável, por exemplo, ele só faz update dos campos que foram modificados, suporta transações, entre outras coisas.
O que vcs acham? Uso esse DBBean (veja código abaixo) ou melhor aprender Hibernate e começar a configurar os arquivos XML ???
import java.sql.SQLException;
import com.smartjava.dbbean.DBBean;
import com.smartjava.dbbean.DBField;
import com.smartjava.dbbean.DBType;
import com.smartjava.dbpool.ConnectionHandler;
public class Profile extends DBBean { // ou MySqlDBBean ou OracleDBBean
private static final ConnectionHandler connHandler = ConnectionHandler.getInstance("profile");
private DBField id = new DBField(this, DBType.AUTOINCREMENT, "id", true);
private DBField username = new DBField(this, DBType.STRING, "username");
private DBField deleted = new DBField(this, DBType.BOOLEAN, "deleted");
public Profile() {
super.setConnectionHandler(connHandler);
}
// função abstrata obrigatória...
public String getTableName() { return "profiles"; }
public void setId(int id) {
this.id.setValue(id);
}
public int getId() {
return id.getIntValue();
}
public void setUsername(String username) {
this.username.setValue(username);
}
public String getUsername() {
return username.getStringValue();
}
public void setDeleted(boolean deleted) {
this.deleted.setValue(deleted);
}
public boolean isDeleted() {
return deleted.getBooleanValue();
}
public static void main(String [] args) throws SQLException {
Profile p1 = new Profile();
p1.setId(1);
p1.setUsername("soliveira");
p1.insert();
Profile p2 = new Profile();
p2.setId(1);
if (p2.load()) {
System.out.println("USERNAME: " + p2.getUsername());
}
p2.setUsername("saoj");
p2.update();
Profile p3 = new Profile();
p3.setId(1);
if (p3.load()) {
System.out.println("USERNAME: " + p3.getUsername());
}
p3.delete();
}
}


:ConnectionHandler encapsula dentro dela um pool de conexões. Assim como cada pool de conexões deve ser um singleton, cada connection handler para aquele pool tb deve ser um singleton. Mas posso estar errado!