Salvar Bd Tabela Pai e Filho

15 respostas
E

Tenho uma tela, que seria Pai(Cadguia) e Filho(Itensguia - carrego uma lista), gostaria de através do meu metodo salvar,
que salvasse na minha tabela Cadguia e itemguia.

Obs. A cadguia esta salvando certo, gostaria de ter uma ideia de como vou salvar na tabela Itensguia.

segue abaixo meu codigo e entidades:

public class Cadguia implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "codguia")
    private Integer codguia;
    @Size(max = 1)
    @Column(name = "tipoguia")
    private String tipoguia;
    @Column(name = "numtransacao")
    private Integer numtransacao;
    @Size(max = 1)
    @Column(name = "status")
    private String status;
    @Size(max = 1)
    @Column(name = "origem")
    private String origem;
    @Column(name = "guiaorigem")
    private Integer guiaorigem;
    @Column(name = "guiaauxiliar")
    private Integer guiaauxiliar;
    @Column(name = "dataemi")
    @Temporal(TemporalType.DATE)
    private Date dataemi;
    @Size(max = 8)
    @Column(name = "hora")
    private String hora;
    @Size(max = 30)
    @Column(name = "senha")
    private String senha;
    @Column(name = "codbenef")
    private String codbenef;*/
    
    @JoinColumn(name = "codbenef", referencedColumnName = "codbenef")
    @ManyToOne
    private Cadusu codbenef;
    
    @JoinColumn(name = "codprest", referencedColumnName = "codprest")
    @ManyToOne
    private Cadprest codprest;

   
    @Column(name = "codsoli")
    private Integer codsoli;
    @Column(name = "codadministradora")
    private Integer codadministradora;
    @Column(name = "codadministradorareq")
    private Integer codadministradorareq;
    @Size(max = 1)
    @Column(name = "eventual")
    private String eventual;
    @Size(max = 6)
    @Column(name = "codtipcont")
    private String codtipcont;
    @Size(max = 6)
    @Column(name = "codespec")
    private String codespec;
    @Column(name = "codprestatend")
    private Integer codprestatend;
    @Size(max = 1)
    @Column(name = "tipoprestpagto")
    private String tipoprestpagto;
    @Column(name = "codprestpagto")
    private Integer codprestpagto;
    @Column(name = "tipoprestreceb")
    private Character tipoprestreceb;
    @Size(max = 17)
    @Column(name = "codprestreceb")
    private String codprestreceb;
    @Column(name = "dataini")
    @Temporal(TemporalType.DATE)
    private Date dataini;
    @Column(name = "datafim")
    @Temporal(TemporalType.DATE)
    private Date datafim;
    
    @JoinColumn(name = "codcid", referencedColumnName = "codcid")
    @ManyToOne
    private Cadcid codcid;
    
    
    @Size(max = 4)
    @Column(name = "codcidsec")
    private String codcidsec;
    @Size(max = 300)
    @Column(name = "obs")
    private String obs;
    @Size(max = 300)
    @Column(name = "obs2")
    private String obs2;
    @Size(max = 1)
    @Column(name = "cancelada")
    private String cancelada;
    @Column(name = "datacanc")
    @Temporal(TemporalType.DATE)
    private Date datacanc;
    @Size(max = 4)
    @Column(name = "usucanc")
    private String usucanc;
    @Size(max = 100)
    @Column(name = "motcanc")
    private String motcanc;
    @Size(max = 6)
    @Column(name = "tipoautoriza")
    private String tipoautoriza;
    @Size(max = 1)
    @Column(name = "finalidade")
    private String finalidade;
    @Size(max = 500)
    @Column(name = "indclinica")
    private String indclinica;
    @Size(max = 1)
    @Column(name = "aptenf")
    private String aptenf;
    @Size(max = 1)
    @Column(name = "tipocons")
    private String tipocons;
    @Size(max = 1)
    @Column(name = "carater")
    private String carater;
    @Size(max = 2)
    @Column(name = "tipoatend")
    private String tipoatend;
    @Size(max = 1)
    @Column(name = "acidente")
    private String acidente;
    @Size(max = 1)
    @Column(name = "tiposaida")
    private String tiposaida;
    @Size(max = 1)
    @Column(name = "tipodoenca")
    private String tipodoenca;
    @Size(max = 4)
    @Column(name = "temdoenca")
    private String temdoenca;
    @Size(max = 1)
    @Column(name = "undoenca")
    private String undoenca;
    @Size(max = 1)
    @Column(name = "tipoparto")
    private String tipoparto;
    @Column(name = "atendrn")
    private Short atendrn;
    @Column(name = "nasctermo")
    private Short nasctermo;
    @Column(name = "nascmorto")
    private Short nascmorto;
    @Column(name = "nascprema")
    private Short nascprema;
    @Size(max = 2)
    @Column(name = "emgestacao")
    private String emgestacao;
    @Size(max = 1)
    @Column(name = "aborto")
    private String aborto;
    @Size(max = 1)
    @Column(name = "transmat")
    private String transmat;
    @Size(max = 1)
    @Column(name = "comppuerp")
    private String comppuerp;
    @Size(max = 1)
    @Column(name = "compneo")
    private String compneo;
    @Size(max = 1)
    @Column(name = "baixopeso")
    private String baixopeso;
    @Size(max = 1)
    @Column(name = "atuxml")
    private String atuxml;
    @Size(max = 1)
    @Column(name = "recebcaixa")
    private String recebcaixa;
    @Size(max = 1)
    @Column(name = "auditoria")
    private String auditoria;
    @Size(max = 1)
    @Column(name = "statusaud")
    private String statusaud;
    @Column(name = "dataaud")
    @Temporal(TemporalType.DATE)
    private Date dataaud;
    @Size(max = 200)
    @Column(name = "obsaud")
    private String obsaud;
    @Size(max = 1)
    @Column(name = "dadosentregue")
    private String dadosentregue;
    @Column(name = "dataentrega")
    @Temporal(TemporalType.DATE)
    private Date dataentrega;
    @Column(name = "codsitubloq1")
    private Integer codsitubloq1;
    @Size(max = 100)
    @Column(name = "mensagem1")
    private String mensagem1;
    @Column(name = "codsitubloq2")
    private Integer codsitubloq2;
    @Size(max = 100)
    @Column(name = "mensagem2")
    private String mensagem2;
    @Column(name = "codsitubloq3")
    private Integer codsitubloq3;
    @Size(max = 100)
    @Column(name = "mensagem3")
    private String mensagem3;
    @Column(name = "codsitubloq4")
    private Integer codsitubloq4;
    @Size(max = 100)
    @Column(name = "mensagem4")
    private String mensagem4;
    @Column(name = "codsitubloq5")
    private Integer codsitubloq5;
    @Size(max = 100)
    @Column(name = "mensagem5")
    private String mensagem5;
    @Size(max = 4)
    @Column(name = "usucod")
    private String usucod;
    @Size(max = 1)
    @Column(name = "complemento")
    private String complemento;



public class Itensguia implements Serializable {
    private static final long serialVersionUID = 1L;
    @Column(name = "qtdsol")
    private Integer qtdsol;
    @Column(name = "qtdaut")
    private Integer qtdaut;
    // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    @Column(name = "ch")
    private BigDecimal ch;
    @Column(name = "filme_m2")
    private BigDecimal filmeM2;
    @Column(name = "status")
    private Character status;
    @Size(max = 1)
    @Column(name = "auditoria")
    private String auditoria;
    @Size(max = 1)
    @Column(name = "statusaud")
    private String statusaud;
    @Column(name = "dataaud")
    @Temporal(TemporalType.DATE)
    private Date dataaud;
    @Size(max = 200)
    @Column(name = "obsaud")
    private String obsaud;
    @Column(name = "valfator")
    private BigDecimal valfator;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    @JoinColumns({
        @JoinColumn(name = "codtab", referencedColumnName = "codtab"),
        @JoinColumn(name = "codproc", referencedColumnName = "codproc"),
        @JoinColumn(name = "seqproc", referencedColumnName = "seqproc")})
    @ManyToOne
    private Tabproc tabproc;
    @JoinColumn(name = "codguia", referencedColumnName = "codguia")
    @ManyToOne(optional = false)
    private Cadguia codguia;

    public Itensguia(Integer qtdsol, int id, Tabproc tabproc, Cadguia codguia) {
                this.qtdsol = qtdsol;
                this.id = id;
                this.tabproc=tabproc;
                this.codguia=codguia;
        }



    @Override
    public void salvar(ActionEvent ev) throws Exception {


                    super.salvar(ev);
                    
   }                    



    @Interceptors({GerenciaTransacaoInterceptor.class})
    @Override
    public void salvar(T obj) {
        emAux.persist(obj);
    }

15 Respostas

Rodrigo_Sasaki

Cadguia tem relacionamento com Itensguia? eu não encontrei

E

Não tem, somente o itensguia tem o relacionamento com a Cadguia.

Rodrigo_Sasaki

Então você tem que persistir os itens na mão. Não tem como saber que tem que persistir os filhos, se eles não estão relacionados na entidade.

E

vou ter que criar isso na cadguia

@JoinColumn(name = "itensguia", referencedColumnName = "itensguia")  
    @ManyToOne(optional = false)  
    private Itensguia itensguia;

e criar o campo “itensguia” na tabela cadguia ?

Rodrigo_Sasaki

Não, não tem que ser alterado nada nas tabelas.
Somente precisa criar o relacionamento anotado com OneToMany do lado do Cadguia

E

entao na minha entidade coloco assim :

***** Esta minha lista esta carregada com as informacoes
Codigo Procedimento , descricao procedimento e qtd .

Lista carregada abaixo somente com essa informacoes.

private List<Itensguia> Itensguias;
Entidade
   @ManyToOne(optional = false)    
   private Itensguia itensguia;

Preciso gravar fisicamente as seguintes iinformacoes

codtab ESTA NA MINHA VIEW 
codproc CARREGO NA LISTA 
seqproc integer, -- **TABELA : TABPROC->seqproc
qtdsol integer, -- CARREGO NA LISTA 
qtdaut integer, -- VALOR DEFAULT 0
ch numeric(16,4), *** TABELA : tabproc->ch
filme_m2 numeric(12,4), *** TABELA tabproc->filme_m2

Como eu poderia gravar na itensguia. ? ???

Nicolas_Fernandes

evandro_araujo:

Tenho uma tela, que seria Pai(Cadguia) e Filho(Itensguia - carrego uma lista), gostaria de através do meu metodo salvar,
que salvasse na minha tabela Cadguia e itemguia.

Obs. A cadguia esta salvando certo, gostaria de ter uma ideia de como vou salvar na tabela Itensguia.[/code]


E aí, evandro_araujo, beleza?

Tava pensando aqui… Como sua relação é “pai-filho” sendo que você implementa um relação 1-N sem herança?
A relação “pai-filho”, ao meu ver, se dá quando o filho herda do pai. Assim implementamos a relação. No seu caso, você cria um objeto Cadguia dentro dos Itensguia, não caracterizando uma relação assim.

Você pode implementar uma herança entre essas classes e usar as anotações @Inheritance para tal.
Dá uma olhada nesse link e, principalmente, no relacionamento das suas tabelas no banco de dados.

Hebert_Coelho

Esse post mostra como salvar com JPA usando os tipos de herança e quais suas vantagens e desvantagens:
JPA: Mini Livro - Primeiros passos e conceitos detalhados

E

Fiz o seguinte,
Na minha entidade :

@OneToMany
    private List<Itensguia> itmcadguiaList;
******************************************
botao salvar :
***********aqui salva o cadguia 
                    super.salvar(ev);

                    /*Abre o modal para capturar as informacoes do codguia e transacao */
                        List<Object> objectList =servico.burcarcodguia(vHora, getData());

                        Iterator iterator = objectList.iterator();

                        while(iterator.hasNext()){
                            Object []obj = (Object[])iterator.next();                    
                            this.vcodigodaguia = (Integer) obj[0];
                            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("codguia", 0);                                         
                            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("codguia",  this.vcodigodaguia );                                         
                            this.vnumerodatransacao = (Integer) obj[1];
                        }   
                    /*Abre o modal para capturar as informacoes do codguia e transacao */            


         List<Itensguia> Itensguiasnova = servico.listaritensguia(Itensguias,(Integer) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("codguia"));
         
        Itensguias=Itensguiasnova;
**** A linha debaixo que  o nulllpoint
        obj.setItmcadguiaList(Itensguias);
        super.salvar(ev);
Nicolas_Fernandes
evandro_araujo:
Fiz o seguinte, Na minha entidade :
@OneToMany
    private List<Itensguia> itmcadguiaList;
******************************************
botao salvar :
***********aqui salva o cadguia 
                    super.salvar(ev);

                    /*Abre o modal para capturar as informacoes do codguia e transacao */
                        List<Object> objectList =servico.burcarcodguia(vHora, getData());

                        Iterator iterator = objectList.iterator();

                        while(iterator.hasNext()){
                            Object []obj = (Object[])iterator.next();                    
                            this.vcodigodaguia = (Integer) obj[0];
                            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("codguia", 0);                                         
                            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("codguia",  this.vcodigodaguia );                                         
                            this.vnumerodatransacao = (Integer) obj[1];
                        }   
                    /*Abre o modal para capturar as informacoes do codguia e transacao */            


         List<Itensguia> Itensguiasnova = servico.listaritensguia(Itensguias,(Integer) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("codguia"));
         
        Itensguias=Itensguiasnova;
**** A linha debaixo que  o nulllpoint
        obj.setItmcadguiaList(Itensguias);
        super.salvar(ev);
Já pensou em usar o atributo Cascade para gerenciar a inserção da coleção no banco de dados?
E
@OneToMany(cascade = CascadeType.ALL)

assim ??

Nicolas_Fernandes

evandro_araujo:
@OneToMany(cascade = CascadeType.ALL)

assim ??


Esse é um tipo de cascade, sim. Agora, testa a inclusão normalmente, sem precisar fazer separadamente.
Algo como:Cadguia cadguia = new Cadguia(); cadguida.getItensguia().add(new Itemguia("Item 1")); cadguida.getItensguia().add(new Itemguia("Item 2")); cadguida.getItensguia().add(new Itemguia("Item 3")); super.salvar(cadguia);

E

entao primeiramente estou gravando o cadguia.

obj.setAuditoria("0");
                    super.salvar(ev);

**********************Depois que gravado, recupero o codguia gravado no banco 

                        List<Object> objectList =servico.burcarcodguia(vHora, getData());

                        Iterator iterator = objectList.iterator();

                        while(iterator.hasNext()){
                            Object []obj = (Object[])iterator.next();                    
                            this.vcodigodaguia = (Integer) obj[0];
                            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("codguia", 0);                                         
                            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("codguia",  this.vcodigodaguia );                                         


***************Depois que recupero, preencho a minha lista com o codguia selecionando anteriormente. 

         List<Itensguia> Itensguiasnova = servico.listaritensguia(Itensguias,(Integer) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("codguia"));
         

***********Obs. A lista esta vindo preenchida, inclusive com o Codguia.

***********Porem quando eu tento setar o camando abaixo da o erro de null point 

        obj.setItmcadguiaList(Itensguiasnova);
E

Pessoal,

Reestruturei as minhas entidades da seguinte forma :

[code]

public class Cadguia implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "codguia")
    private Integer codguia;

    @OneToMany
    private List<Itensguia> itmcadguiaList;
*************************************************

public class Itensguia implements Serializable {
    private static final long serialVersionUID = 1L;
    @EmbeddedId
    protected ItensguiaPK itensguiaPK;
    @Column(name = "qtdsol")
    @JoinColumn(name = "codguia", referencedColumnName = "codguia", insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private Cadguia cadguia;



@Embeddable
public class ItensguiaPK implements Serializable {
    @Basic(optional = false)
    @NotNull
    @Column(name = "codguia")
    private int codguia;
    @Basic(optional = false)
    @Column(name = "id")
    private int id;

*************************** Metodo Salvar 
********* AQUIIIIIII na minha lista o ItensguiaPK.codguia esta vindo 0
obj.setItmcadguiaList(Itensguias);

                    super.salvar(ev);

O erro apresentado.

During synchronization a new object was found through a relationship that was not marked cascade PERSIST: br.uniplan.modelo.planouni.Itensguia[ itensguiaPK=br.uniplan.modelo.planouni.ItensguiaPK[ codguia=0, id=1 ] ]

[/code]

E

Fiz assim :

Cadguia 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "cadguia")
    private List<Itensguia> itmcadguiaList;

itensguia 

    @JoinColumn(name = "codguia", referencedColumnName = "codguia", insertable = false, updatable = false)
    @ManyToOne(optional = false)

Esta dando este erro :

ex = (java.lang.Exception) java.lang.Exception: javax.ejb.EJBException: javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERROR: insert or update on table “itensguia” violates foreign key constraint "itensguia_codguia_fk"
Detalhe: Key (codguia)=(0) is not present in table “cadguia”.
Error Code: 0
Call: INSERT INTO itensguia (auditoria, ch, codsitubloq, dataaud, filme_m2, mensagem, obsaud, qtdaut, qtdsol, status, statusaud, valfator, id, codguia, codtab, codproc, seqproc) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
bind => [17 parameters bound]
Query: InsertObjectQuery(br.uniplan.modelo.planouni.Itensguia[ itensguiaPK=br.uniplan.modelo.planouni.ItensguiaPK[ codguia=0, id=1 ] ])

Criado 10 de abril de 2013
Ultima resposta 12 de abr. de 2013
Respostas 15
Participantes 4