Usando MySQL com GlassFishV3

3 Comments

Esta semana recebi mais uma mensagem de um leitor da revista Java Magazine, Marcos:

Comprei as edições 80, 81 e 82 da Java Magazine para eu poder aprender a utilizar o Java EE 6. Mas estou com muitas dúvidas.

1 – Criei o banco de dados direitinho e fui implementar a classe de entidade “ChamadaEmergencia”. Segui direitinho mas o NetBeans deu um código nada a ver com o que o senhor implementou na revista. A pergunta é: por que ele criou este código tão diferente?

[cce_java]
package br.com.javamagazine.siscontram.dominio;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/**
*
* @author Marcos
*/
@Entity
public class ChamadaEmergencia implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}

@Override
public boolean equals(Object object) {
// TODO: Warning – this method won’t work in the case the id fields are not set
if (!(object instanceof ChamadaEmergencia)) {
return false;
}
ChamadaEmergencia other = (ChamadaEmergencia) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}

@Override
public String toString() {
return “br.com.javamagazine.siscontram.dominio.ChamadaEmergencia[id=” + id + “]”;
}
}
[/cce_java]

2 – Em seguida, resolvi fazer diferente, baixei os fontes que o senhor liberou para download, puxei para dentro do NetBeans e executei. O browser abriu com a descrição “SisContrAm” e logo abaixo o link “Cadastro de Ambulâncias”. No entanto quando eu clico no link dá o seguinte erro:

[cce_text]
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services – 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Error in allocating a connection. Cause: Class name is wrong or classpath is not set for : com.mysql.jdbc.jdbc2.optional.MysqlDataSource
Error Code: 0
at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:309)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:138)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:94)
at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:584)
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:228)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:369)
… 132 more
Caused by: java.sql.SQLException: Error in allocating a connection. Cause: Class name is wrong or classpath is not set for : com.mysql.jdbc.jdbc2.optional.MysqlDataSource
at com.sun.gjc.spi.base.DataSource.getConnection(DataSource.java:112)
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:126)
… 137 more
[/cce_text]

Olá Marcos,

Com relação à pergunta 1, o NetBeans possui alguns modelos (templates) de código para alguns tipos específico de componente. No caso de entidade de domínio, é este o modelo mesmo: a anotação [cci_java]@Entity[/cci_java] um ID e os métodos [cci_java]hashCode()[/cci_java], [cci_java]equals()[/cci_java] e [cci_java]toString()[/cci_java] vem já implementados.

No artigo foi utilizada uma super-classe [cci_java]ObjetoPersistenteImpl[/cci_java], que implementa todas estas coisas (ID e os métodos), além de prover também um atributo para versionamento (para optimistic locking dos dados). Desta maneira, não é necessário reimplementar isso em cada classe de domínio.

Dado que o NetBeans gera estes métodos para você, tê-los implementado em cada classe de domínio não daria trabalho nenhum. No entanto, prefiro ainda assim colocar tudo isso numa superclasse e fazer com que as entidades de domínio herdem tudo dela.

Com relação à pergunta 2, uma coisa que infelizmente faltou no artigo (e agora não tem mais como corrigir) foi uma explicação sobre a inclusão do driver do MySQL no GlassFish caso se queira utilizar este banco de dados. Na página do artigo no site da DevMedia, no entanto, tem um comentário meu em resposta a uma pergunta parecida que foi feita lá que explica como fazer:

http://www.devmedia.com.br/post-17118-Java-EE-6-na-Pratica-Parte-1-Java-Magazine-80.html

Para obter o driver MySQL para Java visite a página http://www.mysql.com/downloads/connector/j/. O arquivo se chama mysql-connector-java-5.1.13.zip (ou .tar.gz e o número pode mudar se for lançada uma nova versão) e deve ser descompactado. Em seguida, o arquivo mysql-connector-java-5.1.13-bin.jar (novamente, o número pode mudar) deve ser colocado na seguinte pasta: diretorio-do-glassfish/glassfish/domains/domain1/lib/ext. Se o GlassFish estiver rodando, reinicie-o.

Seguindo as instruções do artigo para criação da primeira entidade de domínio, o NetBeans deve criar as configurações necessárias para o acesso ao banco de dados. O banco de dados em si, no entanto, não é criado pelo NetBeans, você deve criá-lo separadamente. Com o banco criado e o NetBeans configurado, o JPA deve ser capaz de criar as tabelas automaticamente assim que ele (o JPA) for utilizado pela primeira vez, ou seja, na primeira consulta ou gravação de dados.

Para conferir se está tudo em seu devido lugar, abra o projeto SisContrAm-ejb e dentro do item Server Resources você deve encontrar o arquivo sun-resources.xml. Ao abri-lo, deve ver algo parecido com o seguinte:

[cce_xml]






[/cce_xml]

Este arquivo dá ao GlassFish as instruções para criar a conexão ao banco de dados. Para ver se esta foi criada corretamente, abra a aba Services do NetBeans, expanda o item Servers, clique com o botão direito no servidor GlassFish e selecione Start. Em seguida, clique novamente com o botão direito no GlassFish e selecione View Admin Console. O console de administração se abrirá em uma janela/aba do seu navegador.

No console, abra o item Resources > JDBC > JDBC Resources e você deverá encontrar SisContrAm-ds ali. Da mesma forma, expandindo Resources > JDBC > Connection Pools você deverá encontrar mysql_SisContrAm_SisContrAmPool ali. Clique neste último para abri-lo e, em seguida, clique no botão Ping. Se o console retornar uma mensagem “Ping Succeeded”, sua conexão está funcionando.

Do contrário, é preciso verificar se o MySQL está rodando, se o banco de dados SisContrAm existe e se o usuário e senha configurados no arquivo sun-resources.xml (que apresentei acima) existem e possuem acesso ao banco em questão. Recomendo que faça estas verificações de qualquer forma antes da primeira implantação da aplicação.

Espero que ajude, bons estudos!

3 thoughts on “Usando MySQL com GlassFishV3

  1. Vítor,
    voce poderia disponibilizar a super classe ObjetoPersistenteImpl ? Estou tendo problemas na herança com essa classe( Está exigindo o @id ), é como se ele não exergasse essa classe que eu herdei.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

code