| Author |
Message |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/03/2006 11:47:18
|
andre_guitar7
![[Avatar]](/images/avatar/f033ab37c30201f73f142449d037028d.jpg)
Joined: 21/03/2006 12:03:21
Messages: 259
Location: Curitiba - PR
Offline
|
Deixei o HibernateFiter pra lá e to tentando usar direto:
Meu action:
Code:
//MeuEspaco.addUsuario
this.action( "MeuEspaco" , MeuEspacoAction.class , "addPessoa" )
.on( MeuEspacoAction.SUCCESS , fwd( "MeuEspaco.pessoaCadastrada.jsp" ) );
Minha função:
Code:
public String addPessoa() throws Exception {
Pessoa pessoa = new Pessoa();
pessoa.setNome( input.getStringValue( "nome" ) );
HibernatePessoaDAO pessoaDAO = new HibernatePessoaDAO();
try{
pessoaDAO.inserir( pessoa );
}catch( Exception e ){
}
return SUCCESS;
}
PessoaDAO:
Code:
public void inserir( Pessoa pessoa ) throws Exception {
Session session = HibernateUtil.currentSession();
Transaction transaction = session.beginTransaction();
//Object r = null;
try{
//r = session.save( pessoa );
session.save( pessoa );
transaction.commit();
//return (Long) r;
}catch( Exception e ){
transaction.rollback();
System.out.println( e.toString() );
}finally {
HibernateUtil.closeSession();
}
//return null;
}
Exception:
Code:
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: java.lang.reflect.InvocationTargetException
org.mentawai.core.Controller.service(Controller.java:313)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
root cause
org.mentawai.core.ActionException: java.lang.reflect.InvocationTargetException
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
org.mentawai.core.InvocationChain.invoke(InvocationChain.java:105)
org.mentawai.core.Controller.invokeAction(Controller.java:340)
org.mentawai.core.Controller.service(Controller.java:288)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
note The full stack trace of the root cause is available in the Apache Tomcat/5.0.28 logs.
Alguém pode me ajudar?
PS: Rodei no main, ele tá persistindo normal...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/03/2006 12:52:41
|
andre_guitar7
![[Avatar]](/images/avatar/f033ab37c30201f73f142449d037028d.jpg)
Joined: 21/03/2006 12:03:21
Messages: 259
Location: Curitiba - PR
Offline
|
Alguém tem uma idéia do que seja a InvocationTargetException?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/03/2006 13:34:16
|
zelopes
![[Avatar]](/images/avatar/a3f390d88e4c41f2747bfa2f1b5f87db.jpg)
Joined: 15/03/2006 20:06:30
Messages: 12
Offline
|
cara...não controle transações direto nos métodos de ação...imagine que você precise usar mais de um método em uma transação...não vai conseguir em hipótese alguma...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/03/2006 13:35:48
|
andre_guitar7
![[Avatar]](/images/avatar/f033ab37c30201f73f142449d037028d.jpg)
Joined: 21/03/2006 12:03:21
Messages: 259
Location: Curitiba - PR
Offline
|
zelopes wrote:
cara...não controle transações direto nos métodos de ação...imagine que você precise usar mais de um método em uma transação...não vai conseguir em hipótese alguma...
Vc tem alguma idéia do que eu possa fazer.. crio mais alguma classe pra controlar as DAO's?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/03/2006 13:41:31
|
andre_guitar7
![[Avatar]](/images/avatar/f033ab37c30201f73f142449d037028d.jpg)
Joined: 21/03/2006 12:03:21
Messages: 259
Location: Curitiba - PR
Offline
|
Criei um pacote manager, dentro desse pacote tem:
PessoaManager:
Code:
public class PessoaManager {
public void addPessoa( Pessoa pessoa ){
HibernatePessoaDAO pessoaDAO = new HibernatePessoaDAO();
try{
pessoaDAO.inserir( pessoa );
}catch( Exception e ){
}
}
}
MeuEspacoAction:
Code:
public class MeuEspacoAction extends BaseAction {
private PessoaManager pessoaManager = new PessoaManager();
public String execute() throws Exception {
return SUCCESS;
}
public String formNovoUsuario() throws Exception {
return SUCCESS;
}
public String addPessoa() throws Exception {
Pessoa pessoa = new Pessoa();
pessoa.setNome( input.getStringValue( "nome" ) );
pessoa.setSobrenome( input.getStringValue( "sNome" ) );
pessoa.setEmail( input.getStringValue( "email" ) );
pessoa.setLogin( input.getStringValue( "login" ) );
pessoa.setSenha( input.getStringValue( "senha" ) );
this.pessoaManager.addPessoa( pessoa );
return SUCCESS;
}
}
Melhor assim?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/03/2006 13:52:49
|
saoj
Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline
|
Olha o mybooks que lá ele usa o TransactionFilter, que é o jeito certo de vc fazer isso...
|
Sergio Oliveira
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/03/2006 14:04:37
|
zelopes
![[Avatar]](/images/avatar/a3f390d88e4c41f2747bfa2f1b5f87db.jpg)
Joined: 15/03/2006 20:06:30
Messages: 12
Offline
|
quando vc da commit dentro do seu método ja era a transação...tente usar mais de um método ae e veja se da ou não...
faça o seguinte...duas opções...não vou entrar na questão do HibernateFilter que tem no menta...pois não uso ele e nem vi como funciona...
primeira opção...
crie uma classe HibernateUtil usando thread local com com os métodos...
getSession() -> pra ti pegar a sessão
closeSession() -> pra ti fechar a sessão
beginTransaction() -> pra iniciar uma transação
commitTransaction() -> pra terminar uma transação
rollbackTransaction() -> pra desfazer a transação
depois disso crie um filtro que gerenie isso pra ti...ou seja...antes de executar a action vc inicia a transação...executa a action...e depois vc fecha a transação...se não der...desfaz a transação com rollback...e por ultimo fecha a sessão independente da transação ocorrer com sucesso ou não...ficaria assim seu filtro...
Code:
public class HiberFilter implements Filter {
public String filter (InvocationChain action) throws Exception {
HibernateUtil.beginTransaction (); // inicia uma nova transação antes de executar a action
String result = action.invoke (); // executa a action
try {
HibernateUtil.commitTransaction (); // se der tudu certo comiita a transação
}
catch (Exception exception) {
HibernateUtil.rollbackTransaction (); // senão der...desfaz a mesma
throw new Exception (exception);
}
finally {
HibernateUtil.closeSession (); // fecha a sessão independente do que ocorrer
}
return result;
}
public void destroy () {
}
}
o HibernateUtil...
Code:
public class HibernateUtil {
private static final SessionFactory factory;
private static final ThreadLocal sessionThread = new ThreadLocal();
private static final ThreadLocal transactionThread = new ThreadLocal();
static {
try {
factory = new Configuration ().configure ().buildSessionFactory ();
} catch (RuntimeException exception) {
exception.printStackTrace ();
throw exception;
}
}
public static Session getSession () {
Session session = (Session) sessionThread.get ();
if (session == null || !session.isOpen ()) {
session = factory.openSession ();
sessionThread.set (session);
}
return (Session) sessionThread.get ();
}
public static void closeSession () {
Session session = (Session) sessionThread.get ();
if (session != null && session.isOpen ()) {
sessionThread.set (null);
session.close ();
}
}
public static void beginTransaction () {
Transaction transaction = getSession ().beginTransaction ();
transactionThread.set (transaction);
}
public static void commitTransaction () {
Transaction transaction = (Transaction) transactionThread.get ();
if (transaction != null && !transaction.wasCommitted () && !transaction.wasRolledBack ()) {
transaction.commit ();
transactionThread.set (null);
}
}
public static void rollbackTransaction () {
Transaction transaction = (Transaction) transactionThread.get ();
if (transaction != null && !transaction.wasCommitted () && !transaction.wasRolledBack ()) {
transaction.rollback ();
transactionThread.set (null);
}
}
}
essa solução não é a melhor...mas é bom pra ti entender como funciona essa questão de controle de transações...o menta tem o TransactionFilter...que deve ser uma boa opção inclusive melhor que essa...mas não olhei ele ainda...também não posso falar
a outra opção que acho bacana é usar spring como ponte...assim ele gerencia isso tudo pra ti e consegue encarar varias transações ao mesmo tempo...mas tem uma penca de xml...e acho melhor vc ficar com TransactionFilterou essa combinação acima...
pra maioria dos casos tu não precisa do spring...pode usar assim mesmo e encarar com uma transação apenas...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/03/2006 14:05:08
|
andre_guitar7
![[Avatar]](/images/avatar/f033ab37c30201f73f142449d037028d.jpg)
Joined: 21/03/2006 12:03:21
Messages: 259
Location: Curitiba - PR
Offline
|
saoj wrote:
Olha o mybooks que lá ele usa o TransactionFilter, que é o jeito certo de vc fazer isso...
bza, vi que tem uma parte do código do AppManager que tem essa linha:
Code:
.filter(new IoCFilter(transaction, "transaction", REQUEST))
.filter(new DependencyFilter("conn", "transaction", "connection"))
.filter(new TransactionFilter())
TransactionFilter depende do IoCFilter ou do DependencyFilter? Tem algum tutorial do TransactionFilter? Fica mais fácil pra eu entender..
vlw
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/03/2006 14:07:30
|
zelopes
![[Avatar]](/images/avatar/a3f390d88e4c41f2747bfa2f1b5f87db.jpg)
Joined: 15/03/2006 20:06:30
Messages: 12
Offline
|
http://www.mentaframework.org/transfilter.jsp
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/03/2006 14:08:35
|
andre_guitar7
![[Avatar]](/images/avatar/f033ab37c30201f73f142449d037028d.jpg)
Joined: 21/03/2006 12:03:21
Messages: 259
Location: Curitiba - PR
Offline
|
zelopes wrote:
quando vc da commit dentro do seu método ja era a transação...tente usar mais de um método ae e veja se da ou não...
faça o seguinte...duas opções...não vou entrar na questão do HibernateFilter que tem no menta...pois não uso ele e nem vi como funciona...
primeira opção...
crie uma classe HibernateUtil usando thread local com com os métodos...
Meu HibernateUtil:
Code:
package br.com.comunidadebetel.dao.hibernate;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static Log log = LogFactory.getLog( HibernateUtil.class );
private static final SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory
sessionFactory = new Configuration().configure( "br/com/comunidadebetel/DAO/hibernate/hibernate.cfg.xml" ).buildSessionFactory();
}catch( Throwable ex ) {
// Make sure you log the exception, as it might be swallowed
log.error( "Initial SessionFactory creation failed." , ex );
throw new ExceptionInInitializerError( ex );
}
}
public static final ThreadLocal session = new ThreadLocal();
public static Session currentSession() {
Session s = ( Session ) session.get();
// Open a new Session, if this Thread has none yet
if( s == null ){
s = sessionFactory.openSession();
session.set( s );
}
return s;
}
public static void closeSession() {
Session s = ( Session ) session.get();
if( s != null ){
s.close();
}
session.set( null );
}
}
Na verdade peguei esse util na net, mas na aplicação pelo main persiste normal...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/03/2006 14:20:03
|
zelopes
![[Avatar]](/images/avatar/a3f390d88e4c41f2747bfa2f1b5f87db.jpg)
Joined: 15/03/2006 20:06:30
Messages: 12
Offline
|
poisé mestre...agora te vira ae!!!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/03/2006 14:22:55
|
andre_guitar7
![[Avatar]](/images/avatar/f033ab37c30201f73f142449d037028d.jpg)
Joined: 21/03/2006 12:03:21
Messages: 259
Location: Curitiba - PR
Offline
|
pra eu fazer uma transação eu preciso de todos esses filtros?
Code:
// create a new transaction for every request and place it in the action input...
ac.addFilter(new IoCFilter(transaction, "transaction", IoCFilter.REQUEST));
// get a connection from the connection pool and place it in the action input...
ac.addFilter(new ConnectionFilter(connHandler));
// look in the input for "conn" and "transaction"
// inject "conn" into "transaction" with setConnection method...
ac.addFilter(new DependencyFilter("conn", "transaction", "connection"));
// begins a transaction for this action...
// action will be atomic!
ac.addFilter(new TransactionFilter());
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/03/2006 15:52:23
|
saoj
Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline
|
Vamos lá. Como exercício tenta descrever pra mim o que cada um desses filtros faz.
|
Sergio Oliveira
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/03/2006 19:41:14
|
andre_guitar7
![[Avatar]](/images/avatar/f033ab37c30201f73f142449d037028d.jpg)
Joined: 21/03/2006 12:03:21
Messages: 259
Location: Curitiba - PR
Offline
|
Vou tentar aprender um por um... vou começar com o IoCFilter... se eu tiver alguma dúvida eu pergunto pra vc...
Valew!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/03/2006 20:06:56
|
saoj
Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline
|
O próprio comentário no código acima está dizendo o que esses filtros fazem, só que está em ingles.
É fundamental entender bem IoC e DI, não só para o Mentawai, mas para a sua vida.
|
Sergio Oliveira
|
|
|
 |
|
|