[Logo] Mentawai Forum - Mentawai Web Framework
  [Search] Search   [Recent Topics] Recent Topics   [Members]  Member Listing   [Groups] Back to home page 
[Register] Register / 
[Login] Login 
Tentando Hibernate Direto...  XML
Forum Index -> Comentários Gerais Go to Page: 1, 2, 3 Next 
Author Message
andre_guitar7


[Avatar]

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...
andre_guitar7


[Avatar]

Joined: 21/03/2006 12:03:21
Messages: 259
Location: Curitiba - PR
Offline

Alguém tem uma idéia do que seja a InvocationTargetException?
zelopes


[Avatar]

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...
andre_guitar7


[Avatar]

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?
andre_guitar7


[Avatar]

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?
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

zelopes


[Avatar]

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...
andre_guitar7


[Avatar]

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
zelopes


[Avatar]

Joined: 15/03/2006 20:06:30
Messages: 12
Offline

http://www.mentaframework.org/transfilter.jsp
andre_guitar7


[Avatar]

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...
zelopes


[Avatar]

Joined: 15/03/2006 20:06:30
Messages: 12
Offline

poisé mestre...agora te vira ae!!!
andre_guitar7


[Avatar]

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());
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

andre_guitar7


[Avatar]

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!
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

 
Forum Index -> Comentários Gerais Go to Page: 1, 2, 3 Next 
Go to:   
Powered by JForum 2.1.6 © JForum Team