[RESOLVIDO] Dúvida sobre PK e erro ao inserir no banco de dados usando PK gerado pelo Netbeans

Bom dia GUJMANÍACOS!!

Bem, tenho uma classe pessoa que contém uma list de EnderecoPessoa e outras lists, como por exemplo Telefone e Email, abaixo segue parte do código:

public class Pessoa implements Serializable {

    private static final long serialVersionUID = 1L;
    /*
     * Aqui eu tenho atributos
     * E aí embaixo tenho a list de EnderecoPessoa que disse a vocês
     */
    @BatchSize(size = 10)
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "pessoa", fetch = FetchType.LAZY)
    private List<EnderecoPessoa> enderecoPessoaList = new ArrayList<EnderecoPessoa>();
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "pescodigo", fetch = FetchType.LAZY)
    private List<Email> emailList = new ArrayList<Email>();
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "pescodigo", fetch = FetchType.LAZY)
    private List<Telefone> telefoneList = new ArrayList<Telefone>();
    /*
     * Aqui eu tenho os getters and setters
     */
}

A classe EnderecoPessoa é composta por atributos e métodos que estão logo abaixo:

public class EnderecoPessoa implements Serializable {

    private static final long serialVersionUID = 1L;
    /*
     * Como podem ver eu tenho uma classe que é a PK para esta classe enderecoPessoa
     */
    @EmbeddedId
    protected EnderecoPessoaPK enderecoPessoaPK = new EnderecoPessoaPK();
    @Column(name = "pesnumero", length = 10)
    private String pesnumero;
    @JoinColumn(name = "pescodigo", referencedColumnName = "pescodigo", nullable = false, insertable = false, updatable = false)
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Pessoa pessoa = null;
    @JoinColumn(name = "endcodigo", referencedColumnName = "endcodigo", nullable = false, insertable = false, updatable = false)
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Endereco endereco = null;

Esta classe EnderecoPessoaPK contém os atributos e métodos listados abaixo:

@Embeddable
public class EnderecoPessoaPK implements Serializable {

    @Basic(optional = false)
    @Column(name = "pescodigo", nullable = false)
    private int pescodigo;
    @Basic(optional = false)
    @Column(name = "endcodigo", nullable = false)
    private int endcodigo;

Aí vem o problema, :cry:!
Tento inserir no banco de dados a minha pessoa com as listagens de telefone, email e enderecoPessoa, o JPA + Hibernate [color=red][size=18]NÃO[/size] [/color]insere!
Tento inserir no banco de dados a minha pessoa [color=red][size=18]apenas [/size] [/color]com a listagem de enderecoPessoa, o JPA + Hibernate [color=red][size=18]NÃO[/size] [/color]insere!
Tento inserir no banco de dados a minha pessoa com a listagem de telefone, o JPA + Hibernate insere!
Tento inserir no banco de dados a minha pessoa com as listagens de telefone e email, o JPA + Hibernate insere!

Aí penso que o problema é a maneira como foi gerado o mapeamento da minha classe enderecoPessoaPK, estou certo a pensar isso?

O ERRO que ocorre é:

Como vocês podem ver eu estou recebendo a entrada 0 no lugar de receber o código da pessoa que foi salva pelo Hibernate (Deixei em vermelho em uma letra maior para poderem visualizar melhor).
Não sei o motivo pelo qual ele nao recebe o código da pessoa, pois ja fiz muita coisa e ele nao recebe esse código XEXELENTO (rsrsrrs), vi alguns tópicos aqui no GUJ de outros AMIGOS que tentam fazer algumas modificações no código gerado pelo Netbeans, mas nao obtive sucesso.

Gostaria de saber como posso fazer para que meu enderecoPessoa seja salvo como a classe Telefone e Email que nao ocorrem problemas ao tentar salva-las.

Agradeço a todos que tiveram paciência para ler o post inteiro pois sei que é grande, mas prefiro deixa-lo grande tendo praticamente todas as informações sobre o problema do que ir detalhando tudo conforme perguntarem!
Fiquem na PEACE DO LORD!

Bom dia ramaciotti,

uma perguntinha, pq você fez com que o relacionamento pessoa - endereço fosse n:m , vai ser possível um endereço ser para mais de uma pessoa e uma pessoa possuir mais de um endereço? (não sei qual sistema você está fazendo, mas talvez não precise de tudo isso).

Outra perguntinha… para que serve a variável numPessoa ?

Bom dia rodrigocolasso,

Respostas: (rsrsrsrs)

1 - Sim, é possível que a minha pessoa possua varios enderecos e também um endereço seja de varias pessoas. Pois imagino que seja certo dessa forma.
Uma pessoa nao pode ter vários endereços e ao contrário nao é valido também?
(Você teria uma idéia melhor de como fazer isso?)

2 - A variável numPessoa serve para guardar o numero da casa/apartamento da pessoa ou até mesmo se a casa/apartamento for sem numero pode ser guardado S/N.

Obrigado pela atenção!

Fique na PEACE DO LORD! rsrsrs

Então …

Como falei não sei qual o sistema que você está desenvolvendo, mas ao meu ver é difícil cadastrar várias pessoas do mesmo endereço e isso só iria te ajudar a diminuir o espaço usado do banco (que é pra isso que server as relações :roll:).

Se você já tem um enderço cadastrado para uma pessoa, pq vai colocar o atributo numPessoa na tabela enderecoPessoa, ele deveria estar no endereco, pq um endereço sem número de casa não é um endereço completo … entende ?

Só se você quis dizer que endereço como cidade, bairro e ruas … mas ai é outra história

Bom geralmente faço assim … crio a tabela de estados, cidades, bairros, logradouros e coloco o número da casa, complemento e cep na tabela da pessoa.

Entao brother!

Nao posso deixar nem o CEP nem o numPessoa na tabela Pessoa, pois se nao teria que criar um campo cep e numPessoa para cada endereco que a pessoa poderia ter, pois ela pode ter varios enderecos.

O meu problema acaba sendo o meu relacionamento, como poderia faze-lo para que se comporte como a minha tabela Telefone e email?

Abraxxxxxxxx meu chapa.

Fique na PEACE DO LORD!

Sem problemas coloque o cep e o número na tabela de endereço e essa tabela tendo um relacionamento oneToMany com a Pessoa.

Não iria funcionar assim ?

entao brow…

Meu numero pode ser diferente para cada CEP, pois um CEP eh composto de varios numeros, nao posso fazê-lo dessa forma.
E no caso eu posso ter uma pai e filho que sejam clientes e tenham cadastros diferentes mas com o endereco igual.

Teria alguma outra carta na manga?? rsrsrs…

Mto obrigado pela ajuda!

[quote=ramaciotti]entao brow…

Meu numero pode ser diferente para cada CEP, pois um CEP eh composto de varios numeros, nao posso fazê-lo dessa forma.
E no caso eu posso ter uma pai e filho que sejam clientes e tenham cadastros diferentes mas com o endereco igual.

Teria alguma outra carta na manga?? rsrsrs…

Mto obrigado pela ajuda!

[/quote]

Não … com certeza pode ser diferente (estou me referindo ao número da casa), e não tem problemas que duas pessoas desses mesmo endereço se cadastrem. Como eu disse o relacionamento que você fez só serve para economizar espaço no banco de dados.

Como assim um CEP é composta de vários números ?

Na verdade quem fez o relacionamento foi o DBA…eu só peguei e to programando…entendeu??..

Os vários numeros sao os numeros das casas…rsrs…nao os digitos do CEP…rsrs…

mas nao entendi o como faria o tudo que me passou…rsrs…

teria como explicar como deveria fazer para melhorar o meu entendimento?

Vlw novamente!

Abraxxxxxxxxxxx

Sem problemas,

cara vou almoçar agora, to morrendo de fome.

Como estou inativo to com bastante tempo para TENTAR ajudar … :smiley:

ola

ligue o debug no maximo para ver a stacktrace completa do erro.

e qual banco de dados esta usando? como esta a configuracao e uso de transacoes? esta usando pool do hibernate ou datasource?

vc vai fazer o seguinte cara,

public class Pessoa implements Serializable {

      @OneToMany(cascade = CascadeType.ALL, mappedBy = "enderecoPessoaPK.pessoa", fetch = FetchType.LAZY)  
      private List<EnderecoPessoa> enderecoPessoaList = new ArrayList<EnderecoPessoa>();

}
@Embeddable  
public class EnderecoPessoaPK implements Serializable {  

 @EmbeddedId  
     protected EnderecoPessoaPK enderecoPessoaPK = new EnderecoPessoaPK();  

     @Column(name = "pesnumero", length = 10)  
     private String pesnumero;  
 
     @JoinColumn(name = "endcodigo", referencedColumnName = "endcodigo", nullable = false, insertable = false, updatable = false)  
     @ManyToOne(optional = false, fetch = FetchType.LAZY)  
     private Endereco endereco = null; 

}
 @Embeddable  
 public class EnderecoPessoaPK implements Serializable {  
   
     @JoinColumn(name = "pescodigo", referencedColumnName = "pescodigo", nullable = false, insertable = false, updatable = false)  
     @ManyToOne(optional = false, fetch = FetchType.LAZY)  
     private Pessoa pessoa = null;  
     @Basic(optional = false)  
     @Column(name = "endcodigo", nullable = false)  
     private int endcodigo; 

ai na do persist, vc vai ter que passar o Objeto Pessoa para a entidade EnderecoPessoaPK, so criar construtores na entidade EnderecoPessoa e EnderecoPessoaPK.

flw cara

La vai…rsrsrs

Hibernate: 
    select
        pessoaclas0_.clacodigo as clacodigo23_1_,
        pessoaclas0_.clanome as clanome23_1_,
        pessoaclas0_.stacodigo as stacodigo23_1_,
        status1_.stacodigo as stacodigo25_0_,
        status1_.stanome as stanome25_0_ 
    from
        unigas_dev5.public.pessoa_classificacao pessoaclas0_ 
    inner join
        unigas_dev5.public.status status1_ 
            on pessoaclas0_.stacodigo=status1_.stacodigo 
    where
        pessoaclas0_.clacodigo=?
Hibernate: 
    insert 
    into
        unigas_dev5.public.pessoa
        (clacodigo, pesapelido, pescpfcnpj, pesnome, pesobservacao, pesrgie, pestipo, stacodigo) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: 
    select
        currval('unigas_dev5.public.pessoa_pescodigo_seq')
Hibernate: 
    select
        formapagam0_.forcodigo as forcodigo13_1_,
        formapagam0_.fornome as fornome13_1_,
        formapagam0_.stacodigo as stacodigo13_1_,
        status1_.stacodigo as stacodigo25_0_,
        status1_.stanome as stanome25_0_ 
    from
        unigas_dev5.public.forma_pagamento formapagam0_ 
    inner join
        unigas_dev5.public.status status1_ 
            on formapagam0_.stacodigo=status1_.stacodigo 
    where
        formapagam0_.forcodigo=?
Hibernate: 
    select
        tipoclient0_.tipcodigo as tipcodigo30_1_,
        tipoclient0_.stacodigo as stacodigo30_1_,
        tipoclient0_.tipnome as tipnome30_1_,
        status1_.stacodigo as stacodigo25_0_,
        status1_.stanome as stanome25_0_ 
    from
        unigas_dev5.public.tipo_cliente tipoclient0_ 
    inner join
        unigas_dev5.public.status status1_ 
            on tipoclient0_.stacodigo=status1_.stacodigo 
    where
        tipoclient0_.tipcodigo=?
Hibernate: 
    insert 
    into
        unigas_dev5.public.cliente
        (clidia, forcodigo, pescodigo, tipcodigo) 
    values
        (?, ?, ?, ?)
Hibernate: 
    select
        currval('unigas_dev5.public.cliente_clicodigo_seq')
Hibernate: 
    insert 
    into
        unigas_dev5.public.email
        (emaemail, pescodigo) 
    values
        (?, ?)
Hibernate: 
    select
        currval('unigas_dev5.public.email_emacodigo_seq')
Hibernate: 
    select
        enderecope0_.endcodigo as endcodigo11_0_,
        enderecope0_.pescodigo as pescodigo11_0_,
        enderecope0_.pesnumero as pesnumero11_0_ 
    from
        unigas_dev5.public.endereco_pessoa enderecope0_ 
    where
        enderecope0_.endcodigo=? 
        and enderecope0_.pescodigo=?
Hibernate: 
    insert 
    into
        unigas_dev5.public.endereco_pessoa
        (pesnumero, endcodigo, pescodigo) 
    values
        (?, ?, ?)
03/08/2011 14:25:56 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 0, SQLState: null
03/08/2011 14:25:56 org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: Entrada em lote 0 insert into unigas_dev5.public.endereco_pessoa (pesnumero, endcodigo, pescodigo) values (666, 471391, 0) foi abortada. Chame getNextException para ver a causa.
03/08/2011 14:25:56 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 0, SQLState: 23503
03/08/2011 14:25:56 org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: ERRO: inserção ou atualização em tabela "endereco_pessoa" viola restrição de chave estrangeira "endereco_pessoa_pescodigo_fkey"
  Detalhe: Chave (pescodigo)=(0) não está presente na tabela "pessoa".
javax.persistence.EntityExistsException: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
        at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:612)
        at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:244)
        at br.com.unigas.interfaceDAO.InterfaceDAO.salvar(InterfaceDAO.java:35)
        at br.com.unigas.managedBean.PessoaManagedBean.salvarCliente(PessoaManagedBean.java:370)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.el.parser.AstValue.invoke(AstValue.java:191)
        at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
        at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
        at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77)
        at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
        at javax.faces.component.UICommand.broadcast(UICommand.java:383)
        at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:329)
        at org.ajax4jsf.component.AjaxViewRoot.broadcastEventsForPhase(AjaxViewRoot.java:304)
        at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:261)
        at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:474)
        at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
        at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
        at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
        at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
        at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
        at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:861)
        at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
        at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1584)
        at java.lang.Thread.run(Thread.java:619)
Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
        at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
        at org.hibernate.engine.ActionQueue.executeInserts(ActionQueue.java:132)
        at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:245)
        at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
        at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)
        at org.hibernate.ejb.event.EJB3MergeEventListener.saveWithGeneratedId(EJB3MergeEventListener.java:43)
        at org.hibernate.event.def.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:186)
        at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:123)
        at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:687)
        at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:669)
        at org.hibernate.engine.CascadingAction$6.cascade(CascadingAction.java:245)
        at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268)
        at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216)
        at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
        at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296)
        at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242)
        at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219)
        at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
        at org.hibernate.engine.Cascade.cascade(Cascade.java:130)
        at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:456)
        at org.hibernate.event.def.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:194)
        at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:123)
        at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:53)
        at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:677)
        at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:661)
        at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:665)
        at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:235)
        ... 38 more
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 insert into unigas_dev5.public.endereco_pessoa (pesnumero, endcodigo, pescodigo) values (666, 471391, 0) foi abortada. Chame getNextException para ver a causa.
        at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2537)
        at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1328)
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:351)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2674)
        at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723)
        at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
        at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
        ... 65 more

Estou usando PostgreSQL e o C3P0 como pool e aih vai o meu persistence.xml para dar uma olhadinha:

<properties>
            <property name="hibernate.connection.username" value="*****"/>
            <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
            <property name="hibernate.connection.password" value="*****"/>
            <property name="hibernate.connection.url" value="jdbc:postgresql://***.***.***.***:****/NomeDoBanco"/>
            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            
            <property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider"/>
            <property name="hibernate.c3p0.acquire_increment" value="5"/>
            <property name="hibernate.c3p0.idle_test_period" value="800"/>
            <property name="hibernate.c3p0.max_size" value="50"/>
            <property name="hibernate.c3p0.max_statements" value="0"/>
            <property name="hibernate.c3p0.min_size" value="10"/>
            <property name="hibernate.c3p0.timeout" value="500"/>
            <property name="max_user_connections" value="30"/>
        </properties>

so fazer do jeito q eu passei ai acima, que vai funcionar… :smiley:

pois vou testa-lo agora…

Estou aki na expectativa…meu DEUSSSSSSSSS!!

Vlw brother!!!

abrax e fika na PEACE DO LORD!

Glória a DEUSSSSSSSSSSS maninhoooooo!!!

funfo tudo balaaaaaaaa!!!

Animalllllllllll!!! show show showwwwwww!!

Vlw meu brother…DEUS te abençoe!!

Acabo de ganhar um amigo que fará o impossivel tbm para te ajudar qdo precisar…vlw???

Abraxxxxxxxxxx e fika na PEACE DO LORD!!!

bom q funcionou… :smiley:

vlw cara

Estou tendo algo parecido utilizando Eclipselink e no form não do jsf não esta cadastrando em campos de multiplas tabelas como poderia resolver ?