Boa noite!
Galera, tenho uma classe com a anotação:
...
@Entity
@Table(name = "clientes", schema = "master")
@NamedQueries({
@NamedQuery(name = "Clientes.findAll", query = "SELECT c FROM Clientes c"),
...
O banco de dados é Sybase Anywhere 9… O driver JPA é eclipselink…
o erro que ocorre é:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: com.sybase.jdbc2.jdbc.SybSQLException: ASA Error -141: Table ‘clientes’ not found Error Code: 2706 Call: SELECT id, nome FROM master.clientes Query: ReadAllQuery(name=“Clientes.findAll” referenceClass=Clientes sql=“SELECT id, nome FROM master.clientes”)
O usuário que está sendo usado para acesso não é o master, mas tem acesso a leitura na tabela.
Tenho certeza absoluta de que a tabela “master.clientes” existe.
O que estou fazendo errado ?
Obrigado
Douglas
Galera, se alguém quiser testar…
Disponibilizei um server de teste:
url=jdbc:sybase:Tds:187.5.218.39:49152?ServiceName=teste
classe=com.sybase.jdbc2.jdbc.SybDataSource
host=187.5.218.39
porta=49152
servicename=teste
usuario=simples
senha=simples
observem que o comando:
select * from master.clientes
se executado diretamente na base de dados trará os resultados, mas usando o JPA com a anotação dá o erro apresentado…
O driver de conexão está nesse endereço: http://187.5.218.39/jconn2.jar
Se alguém puder ajudar…
Obrigado
DRauber
Você deu o grant para esse usuário?
Sim, inclusive a execução conectado com o usuário “simples” diretamente no console do banco de dados funciona perfeitamente.
Obrigado
DRauber
Posta o seu xml de conexão ai, e tb a classe responsável por conectar…
sun-resources.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Resource Definitions //EN" "http://www.sun.com/software/appserver/dtds/sun-resources_1_3.dtd">
<resources>
<jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="com.sybase.jdbc2.jdbc.SybDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="sybase2_externoPool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
<property name="serverName" value="187.5.218.39"/>
<property name="User" value="simples"/>
<property name="portNumber" value="49152"/>
<property name="Password" value="simples"/>
<property name="URL" value="jdbc:sybase:Tds:187.5.218.39:49152?ServiceName=teste"/>
<property name="driverClass" value="com.sybase.jdbc2.jdbc.SybDataSource"/>
</jdbc-connection-pool>
<jdbc-resource enabled="true" jndi-name="Teste" object-type="user" pool-name="sybase2_externoPool"/>
</resources>
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="servicosPU" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>teste</jta-data-source>
<class>modelo.Clientes</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
</properties>
</persistence-unit>
</persistence>
persistenceUtil.java
package dao;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class PersistenceUtil {
private static EntityManagerFactory emf = null;
private PersistenceUtil() {
}
public static EntityManager getEntityManager(){
if(emf == null)
emf = Persistence.createEntityManagerFactory("servicosPU");
return emf.createEntityManager();
}
public static void close(EntityManager em){
if (em != null)
em.close();
}
}
ClientesDAO.java
package dao;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.TypedQuery;
import modelo.Clientes;
public class ClientesDAO {
private static ClientesDAO instance = new ClientesDAO();
public static ClientesDAO getInstance() {
return instance;
}
private ClientesDAO() {
}
public List<Clientes> getAllClientes() {
EntityManager em = PersistenceUtil.getEntityManager();
EntityTransaction tx = em.getTransaction();
List<Clientes> clientes = null;
try {
tx.begin();
TypedQuery<Clientes> query = (TypedQuery<Clientes>) em.createNamedQuery("Clientes.findAll");
clientes = query.getResultList();
tx.commit();
} catch (Exception e) {
if (tx != null && tx.isActive()) {
tx.rollback();
}
throw new RuntimeException(e);
} finally {
PersistenceUtil.close(em);
}
return clientes;
}
}
ClientesMB.java
....
public List<Clientes> getClientes() {
ClientesDAO dao = ClientesDAO.getInstance();
clientes = dao.getAllclientes();
return clientes;
}
...
Acho que isso é o suficiente, se for necessário mais algo, só dizer…
Obrigado
Cara eu acho que não tem nada a haver, mais para fazer select, não é necessário transação, tira isso ai… Olhando aqui, eu acho que esta tudo ok…
lucas_carvalho100:
Cara eu acho que não tem nada a haver, mais para fazer select, não é necessário transação, tira isso ai… Olhando aqui, eu acho que esta tudo ok…
Obrigatório não é, mas proibido também não né? A classe é utilitária, e não vai servir só pra selects…
Obrigado
Douglas
Essa parte aqui acho que não é genérica…
public List<Clientes> getAllClientes() {
EntityManager em = PersistenceUtil.getEntityManager();
EntityTransaction tx = em.getTransaction();
List<Clientes> clientes = null;
try {
tx.begin();
TypedQuery<Clientes> query = (TypedQuery<Clientes>) em.createNamedQuery("Clientes.findAll");
clientes = query.getResultList();
tx.commit();
} catch (Exception e) {
if (tx != null && tx.isActive()) {
tx.rollback();
}
throw new RuntimeException(e);
} finally {
PersistenceUtil.close(em);
}
return clientes;
}
[quote=lucas_carvalho100]Essa parte aqui acho que não é genérica…
public List<Clientes> getAllClientes() {
EntityManager em = PersistenceUtil.getEntityManager();
EntityTransaction tx = em.getTransaction();
List<Clientes> clientes = null;
try {
tx.begin();
TypedQuery<Clientes> query = (TypedQuery<Clientes>) em.createNamedQuery("Clientes.findAll");
clientes = query.getResultList();
tx.commit();
} catch (Exception e) {
if (tx != null && tx.isActive()) {
tx.rollback();
}
throw new RuntimeException(e);
} finally {
PersistenceUtil.close(em);
}
return clientes;
}
[/quote]
Tirei a transação… mas continua sem funcionar…
Mas agora fiz um outro teste, criei uma tabela com o usuário “simples”, porém o mesmo erro de tabela não encontrada
Agora sim a coisa ficou feia. Se tiver alguma outra colocação…
Cara eu to no escritório e aqui, não posso ficar conectando e banco remoto… O pessoal da infra me enforca, assim que chegar em casa vou entrar nesse banco ai e olhar… Deve ser algo no banco… Faz um teste com outro banco se tiver jeito…
Descobri o que causa o erro!!
No mesmo servidor, tenho vários bancos rodando… e a conexão está ignorando o parametro da url …“Service=BancoDados”… e está conectando no primeiro banco da lista…
Para meus testes, agora deixei um backup do banco rodando em uma outra instância… mas ainda não sei como definir o banco a conectar…
Obrigado
Douglas
Experimente a seguinte URL:
jdbc:sybase:Tds:187.5.218.39:49152/teste
Pelo menos é assim na versão do driver que temos aqui.
[quote=gomesrod]Experimente a seguinte URL:
jdbc:sybase:Tds:187.5.218.39:49152/teste
Pelo menos é assim na versão do driver que temos aqui.[/quote]
Usando SQLAnywhere? Qual driver de conexão?
Testei e não funcionou, mas usando o mesmo driver, e conexão jdbc nativa, a url de conexão é aquela que eu apresentei em outros tópicos.
Obrigado