[quote=cv]Voce tambem pode botar uma boina, usar uma gola role e dizer “afe, que coisa mais anos 90, eu faco isso tao melhor com o Spring*, ui!”…
[/quote]
Mas isso também depende muito do ambiente de desenvolvimento que você está. Nos atuais projetos que eu tou trabalhando seria mais dificil conseguir poder usar o springfranework e instegrá-lo à plataforma que re-escrever todo pacote de gerenciamento de transações dele.
public void setUmDAO(UmDao dao) {
this.dao = dao;
}
public void cadastrarAlgo(...) throws CadastraAlgoException {
dao.update( xxx );
}[/code]
(no caso do spring…)
<bean id="X"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="target"><ref local="XTarget"/></property>
<property name="transactionAttributes">
<props>
<prop key="cadastrar*">PROPAGATION_REQUIRED, -x.y.XYException</prop>
</props>
</property>
</bean>
onde o transactionManager pode ser um “org.springframework.orm.hibernate.HibernateTransactionManager”, “org.springframework.transaction.jta.JtaTransactionManager”, etc.
Super simples de configurar (tem um manual bem explicativo para download) e pode ser plugado no JDO, Hibernate, JDBC “classico” e no iBatis SQLMaps (no qual eu uso).
Eu criei um Façade base com controle de transação para um cliente da Discover, que possui os metodos getConnection(), commit(), rollback() e releaseConnection().
Ele suporta aninhamento de chamadas utilizando o conceito de Stack. Ex simplificado :
[code]public class FacadeEspecifico extends BaseFacade
{
public void executarServicoPrincipal() {
Connection conn = getConnection();
try {
UmDAO dao = new UmDAO();
dao.setConnection(conn);
dao.gravarDados();
.............
executarServicoAux();
..............
commit();
}
catch (Exception e) {
rollback();
}
finally {
releaseConnection();
}
}
public void executarServicoAux()
{
// O Base façade utilizará a mesma connection recuperada em
// executarServicoPrincipal
Connection conn = getConnection();
OutroDAO dao = new OutroDAO();
dao.setConnection(conn);
dao.gravarOutrosDados();
............
}
}[/code]
[quote=danieldestro]Mas no meu caso eu gostaria de abstrair esse controle de transação do tipo de acesso aos dados. Explico!
O DAO já é uma abstração para eu não me preocupar qual a fonte dos dados. Eu queria o mesmo com a transação.
Sacou? Valeu![/quote]
Mas mas … não é pra isso que serve o JTA? (Java Transaction API)
(Posso estar viajando … vc quer abstrair o controle de transação do DAO ou o modelo de transação? se for a segunda opçao acho que a JTA é pra isso, se for a primeira opção alguma soluçãozinha de IOC fica legal)
Este link: http://www.springframework.org/docs/MVC-step-by-step/Spring-MVC-step-by-step.html é um tutorial do Spring com o título: Developing a Spring Framework MVC application step-by-step. O que eu entendi é que, além de todas as características do Spring, que são abordadas neste fórum, me pareceu que o Spring também é um Framework MVC, significando que teria papel semelhante ao Struts ou Webwork, por exemplo. Alguém poderia dar uma esclarecida nesta questão?
um dos componentes do spring é um framework MVC sim
tem até alguns recursos bem interessantes, to meio sem tempo agora, mas volto aqui depois e escrevo um pouco sobre eles
Ok, valeu! O que eu achei interessante é que li aqui no fórum coisas boas do Webwork, como framework MVC, e do Spring, para controle de transações, mas nada ainda do Spring como Framework MVC. Penso que talvez seja interessante usar somente o Framework Spring MVC para ambas as tarefas. :?
Se nao me engano o novo site do RSJug (www.rsjug.org) esta sendo desenvolvido (acho que o próprio Urubata é quem ta tocando isso) com o Spring como o Framework MVC. É só dar uma olhada no projeto do RSJug no java net.
exatamente, o site do RSJUG ta sendo desenvolvido (ta meio parado, mas eu termino uma hora destas ) utilizando o SPring MVC e mais diversas partes do spring
quem quiser dar uma olhada é só baixar os fontes do java.net