Struts 2 + Hibernate

3 respostas
D

Pessoal… tá acontecendo uma coisa louca aqui q não estou entendendo…

Alguem poderia me explicar oq tah pegando?

Seguinte…

Tenho uma action, q recebe o objeto cadastroBasico do html…

Tipo…

<s:form action="cadastro" method="post" cssClass="formulario" id="formCadastroUsuario">
  <s:textfield name="cadastroBasico.apelido" 
        value="%{cadastroBasico.apelido}" 
        label="Apelido" size="15" maxlength="50" 
        required="true" />
  ...

A action recebe esse objeto já com o valor correto… q veio do formulario html… envia para uma classe de Serviços que chama o DAO e grava no banco…

tipo…

public void atualizar(CadastroBasicoPF cadastroBasico) throws ServiceException {
  try {
    DAOFactory factory = DAOFactory.getDefaultFactory();
    CadastroBasicoPFDAO cadastroBasicoPFDAO = factory.getDAO(CadastroBasicoPFDAO.class);
    cadastroBasicoPFDAO.salvar(cadastroBasico);
  } catch (DAOException e) {
    throw new ServiceException(e);
  }
}

Beleza… ateh ai tudo certo… está gravando normalmente…

Estou utilizando OpenSessionInView em um servlet filter…

Agora… detalhe…
Se eu fizer isso:

public void atualizar(CadastroBasicoPF cadastroBasico) throws ServiceException {
  try {
    DAOFactory factory = DAOFactory.getDefaultFactory();
    CadastroBasicoPFDAO cadastroBasicoPFDAO = factory.getDAO(CadastroBasicoPFDAO.class);

    cadastroBasico.setApelido("TESTE TESTE TESTE");

    cadastroBasicoPFDAO.salvar(cadastroBasico);
  } catch (DAOException e) {
    throw new ServiceException(e);
  }
}

O apelido que está sendo gravado é o que vem do formulario… e nao o TESTE TESTE TESTE…

Alguem já viu isso???

Valeu se puderem ajudar…

3 Respostas

D

Acho q entendi oq está acontencendo…
Porém não sei como resolver…

Os interceptors são executados antes e depois da action/jsp…

Um dos interceptors (param) é o cara q atribui os parametros q vem do formulario nos atributos da action…

Oq acontece eh q depois q a action é executada, o interceptor é chamado novamente, populando novamente os atributos…

Aí, no final de tudo, quando o commit é executado, os atributos estão novamente com o valor do formulario…

Beleza… dá pra resolver de diversas maneiras… na gambi…

Mas queria saber… alguem saberia dizer?
Se existe alguma forma de evitar que o interceptor param execute novamente após a action?

Acho q d tudo oq pensei, seria a melhor prática?
Não?

Valeu se puderem ajudar…

J

Cara… mudando um pouco de assunto… eu estou tentando fazer um DAOFactory e vi que estaz usando ela… tu poderia me passar a sua implementação pra mim dar uma estudada?? Estou fazendo uns testes aqui…
Abraço!

D

eae... desculpa a demora da resposta... rs...
tipo... nao sei se interessa mais...
mas criei um padrão, [interface.package].[repository].[RepositoryEntityDAO]

onde por exemplo a implementacao o hibernate da interface app.dao.UsuarioDAO estaria em
app.dao.hibernate.HibernateUsuarioDAO..

@SuppressWarnings("unchecked")
	public <T extends GenericDAO> T getDAO(Class<T> daoInterface)
			throws DAOException {
		try {
			// Implementação:
			// [interface.package].[repository].[RepositoryEntityDAO]
			String daoPackage = daoInterface.getPackage().getName() + "."
					+ repository.name().toLowerCase();
			String daoInterfaceName = daoInterface.getSimpleName();
			String daoClassSimpleName = repository.name().toLowerCase()
					.substring(0, 1).toUpperCase().concat(
							repository.name().toLowerCase().substring(1))
					+ daoInterfaceName;
			String daoClassName = daoPackage + "." + daoClassSimpleName;

			Class daoClass = Class.forName(daoClassName);
			return (T) daoClass.newInstance();
		} catch (Exception e) {
			throw new DAOException(e);
		}
	}

Ainda vou colocar um StringBuilder ai... mas basicamente é isso... vc pode criar o seu padrão para facilitar... ajuda bastante
Fiz algo parecido para criar serviços...

Criado 4 de fevereiro de 2008
Ultima resposta 6 de jan. de 2009
Respostas 3
Participantes 2