JPA Não aceita "select from usuario.tabela"

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…

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 :frowning:
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…

Obrigado Lucas!

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