Entendimento JPA 2.0 - EclipseLink

9 respostas
Ivan_Alves

Seguinte to aprendendo JPA 2.0, decide implantar em alguns projetos meus aqui, então surgiu alguns bugs e com isso dúvidas, no meu banco tenho uma tabela de ‘produtos’ e ‘fornecedores’ e uma terceira chamada ‘precos’ que liga as duas parecido com essa tabela desse exemplo

Observe a ligação da segunda tabela
http://javasemcafe.blogspot.com/2011/03/jpa-20-criando-tabelas-parte-3.html

então por exemplo, estou na minha tela de produtos que pode receber uma lista de fornecedores para cada produto quando crio um novo produto e mando salvar ele salva o produto com os dados porém a lista não salva quando eu crio um novo objeto, preciso fazer isso separadamente ou tem alguma coisa a manha que preciso fazer?

Quando tento editar e salvar a lista ela salva normalmente, se eu adicionar ou alterar um item da lista também salva normalmente, então quando remove um item da lista ele também salva normalmente, mas quando vejo no banco ele não remove o item, também preciso fazer isso separadamente?

Uso o EclipseLink vs 2.2(JPA 2.0) e as classes entidades do banco gero tudo pelo NetBeans 7, se alguém poder ajudar com alguma coisa eu agradeço, flw!

9 Respostas

A

vc colocou no seu relacionamento cascade do tipo all?

Ivan_Alves
Sim, olhe o código da minha entity esta assim:
@OneToMany(cascade = CascadeType.ALL, mappedBy = "produto", fetch = FetchType.LAZY)
    private List<Preco> precoList;
Para atualizar ou gerar um novo registro uso os métodos genericos abaixo:
@Override
    public boolean create(T obj){
        System.out.println("Iniciando...");
        em = getEMF().createEntityManager();
        boolean is = false;
        try {
            em.getTransaction().begin();
            System.out.println("Criando transação...");
            em.persist(obj);
            em.getTransaction().commit();
            is = true;
            System.out.println("Finalizando...");
        } catch (Exception e) {
            is = false;
            em.getTransaction().rollback();
            //System.err.println("Erro: " + e.getMessage());
            e.printStackTrace();
        } finally {
            em.close();
            emf.close();
        }
        return is;
    }

    @Override
    public boolean update(T obj) {
        em = getEMF().createEntityManager();
        boolean is = false;
        try {
            em.getTransaction().begin();
            em.merge(obj);
            em.getTransaction().commit();
            is = true;
        } catch (Exception e) {
            is = false;
            em.getTransaction().rollback();
            //System.err.println("Erro: " + e.getMessage());
            e.printStackTrace();
        } finally {
            em.close();
            emf.close();
        }
        return is;
    }
A

tenta colocar essa opcao ai, orphanRemoval = true

Ivan_Alves

Blz cara um com esse código consegui resolver o problema de deletar o(s) item(s) na hora de atualizar, porém o de criar um novo registro ainda não salva os itens e o seguinte erro ocorre:

Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`teste_db`.`precos`, CONSTRAINT `FK_precos_id_produto` FOREIGN KEY (`id_produto`) REFERENCES `produtos` (`id`)) Error Code: 1452 Call: INSERT INTO precos (preco, id_fornecedor, id_produto) VALUES (?, ?, ?) bind => [3 parameters bound] Query: InsertObjectQuery(br.com.entity.Preco[ precoPK=br.com.entity.PrecoPK[ idFornecedor=1, idProduto=0 ] ]) java.lang.IllegalStateException: Exception Description: No transaction is currently active at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.rollback(EntityTransactionImpl.java:122) at br.com.persistence.BaseDAO.create(BaseDAO.java:47) at br.com.persistence.ProdutoDAO.salvar(ProdutoDAO.java:37) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [EL Info]: 2011-09-21 09:17:10.332--ServerSession(9803493)--file:/C:/Users/Ivan/Documents/FlexProjects/PrjTeste/build/web/WEB-INF/classes/_PrjTestePU logout successful at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at flex.messaging.services.remoting.adapters.JavaAdapter.invoke(JavaAdapter.java:418) at flex.messaging.services.RemotingService.serviceMessage(RemotingService.java:183) at flex.messaging.MessageBroker.routeMessageToService(MessageBroker.java:1400) at flex.messaging.endpoints.AbstractEndpoint.serviceMessage(AbstractEndpoint.java:1005) at flex.messaging.endpoints.amf.MessageBrokerFilter.invoke(MessageBrokerFilter.java:103) at flex.messaging.endpoints.amf.LegacyFilter.invoke(LegacyFilter.java:158) at flex.messaging.endpoints.amf.SessionFilter.invoke(SessionFilter.java:44) at flex.messaging.endpoints.amf.BatchProcessFilter.invoke(BatchProcessFilter.java:67) at flex.messaging.endpoints.amf.SerializationFilter.invoke(SerializationFilter.java:166) at flex.messaging.endpoints.BaseHTTPEndpoint.service(BaseHTTPEndpoint.java:291) at flex.messaging.MessageBrokerServlet.service(MessageBrokerServlet.java:353) at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619)

dizendo que eu não estou setando o id do produto que aliás ainda não existe.
Obs.: na hora de criar um novo registro eu não estava o setando minha lista por isso o erro não estava ocorrendo antes, já que ele salvava o que eu passava no caso uma lista vazia, porém com esse erro corrigido ocorre esse erro que falei ai na hora de mandar criar um novo registro.

Obrigado pela ajuda…

A

2 perguntas
Na entidade Preco, vc tem algum tipo de cascade para produto?
Sua chave primaria o atributo é int ou Integer?

A

ve esse link ai http://javablog.co.uk/2009/12/27/onetomany-fixes-in-jpa-2/

Ivan_Alves

alissonvla:
2 perguntas
Na entidade Preco, vc tem algum tipo de cascade para produto?
Sua chave primaria o atributo é int ou Integer?

Seguinte minha classe Preco tem esses atributos

@EmbeddedId protected PrecoPK precoPK; @Basic(optional = false) @Column(name = "preco") private double preco; @JoinColumn(name = "id_produto", referencedColumnName = "id", insertable = false, updatable = false) @ManyToOne(optional = false, fetch = FetchType.LAZY) private Produto produto; @JoinColumn(name = "id_fornecedor", referencedColumnName = "id", insertable = false, updatable = false) @ManyToOne(optional = false, fetch = FetchType.LAZY) private Fornecedor fornecedor;

sendo que tem um objeto para ‘fornecedor’ e outro para ‘produto’ e também usa mais uma classe chamada PrecoPK para armazenar essas chaves primarias do ‘produto’ e do ‘fornecedor’ que possuem os seguintes atributos inteiros

@Basic(optional = false) @Column(name = "id_fornecedor") private int idFornecedor; @Basic(optional = false) @Column(name = "id_produto") private int idProduto;

vou olhar o material que você me passou se souber alguma coisa que estou esquecendo avisa ai, vlw a ajuda!

A

cara,

ve esse link ai, acho q é o msm caso que o seu…

http://www.guj.com.br/java/248978-resolvido-duvida-sobre-pk-e-erro-ao-inserir-no-banco-de-dados-usando-pk-gerado-pelo-netbeans

t+

Ivan_Alves

Cara não consegui tentei algumas coisas que falavam ai e nada!
Você já fez desse forma que falei e funcionou beleza?

Criado 20 de setembro de 2011
Ultima resposta 22 de set. de 2011
Respostas 9
Participantes 2