Salvar Bd Tabela Pai e Filho

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);
    }

Cadguia tem relacionamento com Itensguia? eu não encontrei

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

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.

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 ?

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

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. ? ???

[quote=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][/quote]
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.

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

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 dá o nulllpoint
        obj.setItmcadguiaList(Itensguias);
        super.salvar(ev);


[quote=evandro_araujo]Fiz o seguinte,
Na minha entidade :

[code]
@OneToMany
private List 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 dá o nulllpoint
obj.setItmcadguiaList(Itensguias);
super.salvar(ev);
[/code][/quote]
Já pensou em usar o atributo Cascade para gerenciar a inserção da coleção no banco de dados?

@OneToMany(cascade = CascadeType.ALL)

assim ??

[quote=evandro_araujo] @OneToMany(cascade = CascadeType.ALL)

assim ??[/quote]
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);

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);

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);


[/code]


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 ] ]

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 ] ])