xml sux!
usar annotation é muito melhor
da uma olhada no VRaptor, struts 1 its soooo old....
any way... um Dao não deve criar um factory, um dao deve receber um Session, de alguem que tenha um factory....
uma session não deve ser aberto para cada operação como add, ou remove, ou etc... deve ser aberta para cada Dao criado...
Usando hibernate não se faz necessidade de varios Daos, basta 1 apenas que da pra fazer tudo...
uma forma legal de usar o dao...
public class HibernateGenericDao {
private final Session session;
private boolean autoCommit = false;
public HibernateGenericDao(Session session) {
this.session = session;
}
public boolean isAutoCommit() {
return autoCommit;
}
public void setAutoCommit(boolean enabled) {
this.autoCommit = enabled;
}
private boolean isActiveTransaction() {
return getSession().getTransaction().isActive();
}
private void errorIfTransactionIsStarted() {
if (isActiveTransaction())
throw new IllegalStateException("uma transação já se encontra aberta");
}
private void errorIfTransactionIsNotStarted() {
if (!isActiveTransaction())
throw new IllegalStateException("não há transação aberta");
}
/**
* Inicia uma transação se for necessário
* @return se uma transação precisou ser inciada, e foi iniciada.
*/
private boolean startTransactionIfNeed() {
final boolean needTransaction = isAutoCommit() && !isActiveTransaction();
if (needTransaction)
getSession().beginTransaction();
return needTransaction;
}
/**
* Confirma a tranzação.
* @throws IllegalStateException quando não há operação corrente.
* @throws HibernateException quando há uma falha ao commitar a transação.
*/
private void commitTransaction() {
errorIfTransactionIsStarted();
try {
getSession().getTransaction().commit();
} finally {
if (isActiveTransaction()) {
rollback();
}
}
}
public void rollback() {
errorIfTransactionIsNotStarted();
getSession().getTransaction().rollback();
}
public void persist(Object entity) {
final boolean wasStarted = startTransactionIfNeed();
try {
getSession().persist(entity);
if (wasStarted)
commitTransaction();
} catch(RuntimeException ex) {
if (wasStarted)
rollback();
throw ex;
}
}
método semalhentes a persist para remove, marge, refresh... etc
assim vc pode fazer transações de mais de uma operação, só abre transação quando nenhum estiver aberta, define se seu dao é ou não autocommit, o DAO tem outro método de consultas basicas como... list(Class) ... onde vc lita todos os objetos de uma classe... findById(Class,Serializable) onde vc busca uma entidade referente ao id passado, da classe passada.... enfim N possibilidades