Jsf + jpa

9 respostas
J

Colegas,

Estou com o seguinte problema em uma aplicação exemplo utilizando JSF e JPA:

javax.servlet.ServletException: #{agendaPst.inserir}: javax.faces.el.EvaluationException: javax.faces.FacesException: javax.faces.FacesException: Can’t instantiate class: ‘AgendaPst’… class AgendaPst : javax.persistence.PersistenceException: Exception [TOPLINK-28016] (Oracle TopLink Essentials - 9.1 (Build b25)): oracle.toplink.essentials.exceptions.EntityManagerSetupException
Exception Description: The persistence unit with name [agenda] does not exist.
javax.faces.webapp.FacesServlet.service(FacesServlet.java:209)

Alguém poderia me ajudar?

9 Respostas

tnaires

Olá, pelo que vejo você configurou no seu persistence.xml uma persistence-unit com nome diferente daquele que você está passando como parâmetro para o método Persistence.createEntityManagerFactory(). Dê uma conferida.

J

Olá tnaires,

A princípio pensei que fosse isso também, mas acho que não. Segue os códigos para facilitar:

Persistence.xml

<?xml version="1.0" encoding="UTF-8"?> oracle.toplink.essentials.PersistenceProvider
<class>AgendaBean</class>
	<class>AgendaPst</class>
			
	<properties>
		<property name="toplink.logging.level" value="INFO"/>
		<property name="toplink.jdbc.driver" value="sun.jdbc.odbc.JdbcOdbcDriver"/>
		<property name="toplink.jdbc.url" value="JDBC:ODBC:agenda" />
		<property name="toplink.jdbc.user" value=""/>
		<property name="toplink.jdbc.password" value=""/>
		<property name="toplink.ddl-generation" value="create-tables"/>	
		<property name="toplink.target-database" value="HSQL" />
	</properties>
	
</persistence-unit>

Classe de Persistência

public class AgendaPst{

EntityManagerFactory factory = Persistence.createEntityManagerFactory("agenda");
EntityManager manager = factory.createEntityManager();
EntityTransaction transaction = manager.getTransaction();

public String inserir(String nome,String cidade,String endereco,String telefone){
	
	try {
		AgendaBean agenda = new AgendaBean();
		
		transaction.begin();
		manager.persist(agenda);
		transaction.commit();
		
		return "success";
		
	} catch (Exception e) {
		// TODO: handle exception
		return "failure";
	}
	
}

}

Classe Modelo

@Entity
@Table(name=“AGENDA”)

public class AgendaBean implements Serializable{

@Id

@Column(name=NOME)

String nome;

@Column(name=ENDERECO)

String endereco;

@Column(name=CIDADE)

String cidade;

@Column(name=TELEFONE)

String telefone;
public String getNome() {
	return nome;
}
public void setNome(String nome) {
	this.nome = nome;
}
public String getEndereco() {
	return endereco;
}
public void setEndereco(String endereco) {
	this.endereco = endereco;
}
public String getCidade() {
	return cidade;
}
public void setCidade(String cidade) {
	this.cidade = cidade;
}
public String getTelefone() {
	return telefone;
}
public void setTelefone(String telefone) {
	this.telefone = telefone;
}

}

Se for possível dá uma olhada pra ver se tem alguma coisa errada. Nunca usei JPA com JSF, por isso não sei se é necessário fazer alguma configuração.

tnaires

Você criou um diretório META-INF na raiz do classpath e colocou dentro o arquivo persistence.xml?
Se você estiver usando Eclipse, por exemplo, a raiz do classpath é o diretório src. Crie o diretório lá e coloque o arquivo dentro dele.

LPJava

so um detalhe no eclipse eu recomendo vc criar o META-INF dentro de src fora do eclipse se for windows va pelo explore e crie na mao grande o diretorio com o arquivo, depois dar um refresh no eclipse. Nao sei pq, aqui ele nunca acha o arquivo de persistencia quando crio o folder pelo proprio eclipse.

Agora eu recomendo vc usar o Jboss tool la tem a opcao de vc criar um projeto JPA e ter toda estrutura montada. veja no post abaixo como instalar e configurar o Jboss tool no eclipse.
http://blog.camilolopes.com.br/?p=1177

obs.: usa o recurso de code do guj para seus codigos, por favor.

flw, abraco

J

Galera,

O problema do persistence foi resolvido, mas o que acontece agora é que na minha JSP faço uma chamada para um método sem parâmetros: <p><h:commandButton value="Inserir" action="#{agendaPst.inserir}"/></p> e na minha classe de persistência AgendaPst o método chamado recebe parâmetros: public String inserir(String nome,String cidade,String endereco,String celular) Saberiam me dizer como faço na JSP pra chamar um método como parâmetros ou uma outra maneira de resolver isso?

LPJava,

Valeu pelas dicas, vou dar um olhada no JBoss Tools e quando ao recurso de code, já estou usando neste post. rsrsrs

tnaires
A Expression Language do JSF 1.2 não suporta passagem de argumentos para métodos. Você precisa passar esses valores através de bindings com as propriedades do seu managed bean.
public class AgendaManagedBean {
    private String nome, cidade, endereco, celular;

    // Getters e setters
}
E na sua JSP você faz:
&lt;h:inputText value="#{agenda.nome}" /&gt;
&lt;h:inputText value="#{agenda.cidade}" /&gt;
Onde "agenda" é o nome associado ao ManagedBean no faces-config.xml. Associe cada propriedade com algum componente que permita entrada de dados.
J

tnaires,

Fiz como você falou. Mas como faço pra recuperar os valores passados na JSP e persistir usando JPA?

tnaires

Você pode usar o método inserir() que você definiu antes e associou a um command button.

Quando o usuário clicar no botão, o JSF alimenta as propriedades do managed bean com os valores inseridos nos campos, desde que você tenha efetuado a ligação entre o managed bean e a página de acordo com o post anterior.
public void inserir() {
    Contato contato = new Contato();
    contato.setNome(this.nome);
    contato.setCidade(this.cidade);
    contato.setEndereco(this.endereco);
    contato.setCelular(this.celular);

    // Agora você pode persistir o objeto contato.
}
J

Olá tnaires,

Funcionou. Valeu pela ajuda e pela paciência. É bom saber que nessa área tem sempre alguém disposto a ajudar. Apesar de desenvolvimento não ser meu foco, gosto de conhecer coisas novas. Já havia feito alguma coisa com JPA, mas JSF apenas tinha ouvido falar. Resolvi estudar só para ajudar um colega no trabalho da especialização.

Abraço.

Criado 23 de janeiro de 2010
Ultima resposta 26 de jan. de 2010
Respostas 9
Participantes 3