Toplink

16 respostas
rafadeaguiar

Bom, não sou muito experiente em programação Java, to tentando criar um programa, utilizando o toplink como persistencia no banco.
Bom, meu problema eh o seguinte… tenho uma tabela no banco de dados (postgresql) que tem 3 chaves primárias, crio o persistence e crio as classes mapeadas pelo toplink. Neste caso ele cria uma tabela adicional (Ex: nomedaTabelaPK) com as chaves primárias, até ai tudo bem. O problema está na hora em que eu preciso fazer inserções com estes campos… Minha dúvida eh de como eu faço a referência a estes campos…

Desde já, agradeço a todas as respostas…

16 Respostas

Giulliano

Suas primary keys são auto increment ???

rafadeaguiar

Não… elas nao são auto increment…

Giulliano

Então cara…vc deve trabalhar da mesma forma que vc faria no BD…se vc não tem os valores pro ID ou vc põe na mão…ou pega o último valor da tabela de primaryjeys e soma mais um…

aí não tem jeito…

T

Vc está usando o toplink como persistence provider para JPA ou como ORM standalone?

rafadeaguiar

cara nao entendi… viu eh o seguinte Giulliano… to tentando fazer o seguinte

public static void main(String[] args) {
    BaseDao<AnaEx> dao = new BaseDao<AnaEx>();
    
    AnaEx ana = new AnaEx();
    
    ana.getAnaExPK().setCodigo(1);
    ana.getAnaExPK().setConsistencia(2);
    ana.setChuva(2.1);
    
    System.out.println("Codigo: " + ana.getAnaExPK().getCodigo());
    System.out.println("Consistencia: " + ana.getAnaExPK().getConsistencia());
    System.out.println("Chuva: " + ana.getChuva());
    
   dao.create(ana);
    
}

preciso setar esses valores por exemplo ta, so que desse jeito aqui nao ta dando certo...
rafadeaguiar

como persistence provider…

T

mas porque não tá dando certo? poste o stack trace para ajudar…

rafadeaguiar

Bom, está dando este erro aqui…

run:

[TopLink Info]: 2008.03.14 08:09:50.940ServerSession(8116722)TopLink, version: Oracle TopLink Essentials - 2.0 (Build b58g-fcs (09/07/2007))

[TopLink Info]: 2008.03.14 08:09:51.518ServerSession(8116722)file:/C:/Documents%20and%20Settings/USUARIO/Desktop/testeChavesComp/build/classes/-testeChavesCompPU login successful

Exception in thread main java.lang.NullPointerException

at principal.principalA.main(principalA.java:16)

Java Result: 1

BUILD SUCCESSFUL (total time: 2 seconds)
T

e aonde vc instancia o objeto responsável por mapear as Pk´s?

rafadeaguiar

Bom, essa eh a primeira vez q estou utilizando o toplink, ainda não to muito por dentro de todo o seu potencial…
meu exemplo está da seguinte maneira… tenho um persistence.xml com mapeamento das tabelas do banco… que no caso seria apenas uma, só estou tentando criar um exemplo, ta… como esta tabela tem dois campos como chave primária, na hora de gerar as classes aqui o toplink cria uma nova classe so com as chaves primarias, ta… e ai q ta, nao to conseguindo nem acessar e nem inserir dados nessas chaves. Criei um pacote model para armazenar as classes mapeadas das tabelas… e em outro pacote criei uma classe chamada BaseDao com o seguinte conteúdo:

public class BaseDao {

private static EntityManagerFactory emf;

private EntityManager em;
public BaseDao(){
    emf = Persistence.createEntityManagerFactory("testeChavesCompPU");
    em = emf.createEntityManager();
}

  public boolean create(T obj){
    //incia uma transaçao
    em.getTransaction().begin();
    System.out.println("iniciou transaction..");
    try{
        //persiste o objeto recebido por parametro para o banco
        em.persist(obj);
        //faz o commit no banco
        em.getTransaction().commit();
        em.clear();
        System.out.println("Fez o comitt");
        return true;
    }catch(Exception e){
        e.printStackTrace();
        em.getTransaction().rollback();
        return false;
    }
            
}

}

e tenho uma classe que está postada aqui… que instancia o BaseDao… até o momento eh isso…

T

ta e aonde vc instancia os objetos pk? nesse código q vc postou não há instancia criada ainda das pks…

public static void main(String[] args) {
BaseDao<AnaEx> dao = new BaseDao<AnaEx>();

AnaEx ana = new AnaEx();

ana.getAnaExPK().setCodigo(1);
ana.getAnaExPK().setConsistencia(2);
ana.setChuva(2.1);

System.out.println("Codigo: " + ana.getAnaExPK().getCodigo());
System.out.println("Consistencia: " + ana.getAnaExPK().getConsistencia());
System.out.println("Chuva: " + ana.getChuva());

dao.create(ana);

}

dê uma olhada…

rafadeaguiar

cara eu nao instancio a classe AnaExPK porque dentro da classe AnaEx, essa eh a que eu instanciei, já faz referência a PK dela… eh atraves dela que eu tento acessar a PK…

rafadeaguiar

e ai pessoal, bom ainda não sai do lugar, se alguém tiver alguma idéia ai fico grato…

rafadeaguiar

Bom, consegui resolver o meu problema, deixo aqui a solução para futuramente quem estiver precisando.

public static void main(String[] args) {
BaseDao dao = new BaseDao();

AnaEx ana = new AnaEx(new AnaExPK());

ana.getAnaExPK().setCodigo(1);

ana.getAnaExPK().setConsistencia(2);

ana.setChuva(2.1);
System.out.println("Codigo: " + ana.getAnaExPK().getCodigo());

System.out.println("Consistencia: " + ana.getAnaExPK().getConsistencia());

System.out.println("Chuva: " + ana.getChuva());

dao.create(ana);

}

T

e não era o que eu falei que estava faltando??? Inicializar o objeto pk???

rafadeaguiar

Sim… Valeu pela ajuda…

Criado 13 de março de 2008
Ultima resposta 18 de mar. de 2008
Respostas 16
Participantes 3