Relacionamentos em hibernate + jpa + jsf

Exibições: 0
Mensagem Fórum: Frameworks, APIs e IDE’s Enviada: 07/04/2014 11:51:18 Assunto: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
Olá pessoal sou novato aqui no fórum, eu já vi algumas coisas na net sobre esse assunto mas não encontrei nada que me ajudasse. Estou elaborando um ecommerce com hibernate + jsf + primefaces + jpa + postgres, estou na parte de inserir itens a venda. Só que quando clico no menu para aparecer a página vendarapida.xhtml dá o seguinte erro: Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags: java.lang.ExceptionInInitializerError at Daos.VendaRapidaDaoImpl.consultar(VendaRapidaDaoImpl.java:26) at controller.VendaRapidaBean.<init>(VendaRapidaBean.java:35) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:526) at java.lang.Class.newInstance(Class.java:374) at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:186) at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:100) at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409) at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269) at com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:257) at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:117) at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:80) at org.apache.el.parser.AstValue.getValue(AstValue.java:135) at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:187) at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109) at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194) at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182) at javax.faces.component.UIData.getValue(UIData.java:732) at org.primefaces.component.datatable.DataTable.getValue(DataTable.java:910) at org.primefaces.component.api.UIData.getDataModel(UIData.java:615) at javax.faces.component.UIData.getRowCount(UIData.java:356) at org.primefaces.component.api.UIData.calculateFirst(UIData.java:161) at org.primefaces.component.datatable.DataTableRenderer.preEncode(DataTableRenderer.java:107) at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:81) at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1903) at javax.faces.render.Renderer.encodeChildren(Renderer.java:176) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1896) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1899) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1899) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1899) at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:451) at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:301) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:74) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1015) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652) at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1575) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1533) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:744) Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags at org.hibernate.loader.BasicLoader.postInstantiate(BasicLoader.java:93) at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:118) at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:70) at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:53) at org.hibernate.loader.entity.BatchingEntityLoaderBuilder.buildLoader(BatchingEntityLoaderBuilder.java:75) at org.hibernate.persister.entity.AbstractEntityPersister.createEntityLoader(AbstractEntityPersister.java:2483) at org.hibernate.persister.entity.AbstractEntityPersister.createEntityLoader(AbstractEntityPersister.java:2496) at org.hibernate.persister.entity.AbstractEntityPersister.createLoaders(AbstractEntityPersister.java:3842) at org.hibernate.persister.entity.AbstractEntityPersister.postInstantiate(AbstractEntityPersister.java:3828) at org.hibernate.persister.entity.SingleTableEntityPersister.postInstantiate(SingleTableEntityPersister.java:1018) at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:462) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1790) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1861) at utility.HibernateUtility.<clinit>(HibernateUtility.java:96) ... 66 more As minhas classes VendaRapida e ItemVendaRapida estão logo abaixo: @Entity public class VendaRapida implements Serializable{ @Id @GeneratedValue(strategy= GenerationType.IDENTITY) private Integer id; @Column(name="datarealizada") @Temporal(TemporalType.DATE) private Date datarealizada; @Temporal(TemporalType.TIME) private Date hora; @Column(name="formapagamento", length = 50) private String formapagamento; @Column(name="tipopagamento", length = 50) private String tipopagamento; @Column(name="precototal") private double precototal; @Column(name="precodesconto") private double precodesconto; @Column(name="precovenda") private double precovenda; @Column(name="observacao") private String observacao; @OneToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY) @Fetch(FetchMode.SUBSELECT) //@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) private List<ItemVendaRapida> vendasItens = new ArrayList<ItemVendaRapida>(); //get e sets } @Entity public class ItemVendaRapida implements Serializable{ @Id @GeneratedValue(strategy= GenerationType.IDENTITY) private Integer id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "produto_id", nullable = true, insertable = false, updatable = false) private Produto produto; @ManyToOne(optional = false, cascade=CascadeType.PERSIST) @JoinColumn(nullable = true) private VendaRapida venda; @Column(name="quantidade") private int quantidade; // gets e sets } ]
Alguém tem alguma solução para esse problema, já tentei várias coisas e não consigo resolvê-lo. Obrigado pela ajuda.

Esse post explica o erro e mostra possíveis soluções:
http://uaihebert.com/jpa-mini-livro-primeiros-passos-e-conceitos-detalhados/27/

Hebert eu li o post e li que tem algumas soluções e uma delas é utilizar o Set. Mudei algumas coisas na minha classe VendaRapida.

@Entity
public class VendaRapida implements Serializable{
    
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Integer id;
    @Column(name="datarealizada")
    @Temporal(TemporalType.DATE)
    private Date datarealizada;
    @Temporal(TemporalType.TIME)   
    private Date hora;  
    @Column(name="formapagamento", length = 50)
    private String formapagamento;
    @Column(name="tipopagamento", length = 50)
    private String tipopagamento;
    @Column(name="precototal")
    private double precototal;
    @Column(name="precodesconto")
    private double precodesconto;
    @Column(name="precovenda")
    private double precovenda;
    @Column(name="observacao")
    private String observacao;
    @OneToMany(mappedBy = "vendarapida", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private Set<ItemVendaRapida> vendasItens;

A minha classe itemvendarapida está assim:

@Entity
public class ItemVendaRapida implements Serializable{
    
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Integer id;
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "produto_id", nullable = true, insertable = false, updatable = false)
    private Produto produto;
    @ManyToOne( fetch = FetchType.EAGER )
    @JoinColumn(name = "venda_id", nullable = false ) 
    private VendaRapida venda;
    @Column(name="quantidade")
    private int quantidade;
    
    //get e set
}

Só que dá esse erro: Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: Modelo.ItemVendaRapida.vendarapida in Modelo.VendaRapida.vendasItens

java.lang.ExceptionInInitializerError
	at Daos.VendaRapidaDaoImpl.consultar(VendaRapidaDaoImpl.java:26)
	at controller.VendaRapidaBean.<init>(VendaRapidaBean.java:37)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
	at java.lang.Class.newInstance(Class.java:374)
	at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:186)
	at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:100)
	at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
	at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)
	at com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:257)
	at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:117)
	at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
	at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
	at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:80)
	at org.apache.el.parser.AstValue.getValue(AstValue.java:135)
	at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:187)
	at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
	at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
	at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
	at javax.faces.component.UIData.getValue(UIData.java:732)
	at org.primefaces.component.datatable.DataTable.getValue(DataTable.java:910)
	at org.primefaces.component.api.UIData.getDataModel(UIData.java:615)
	at javax.faces.component.UIData.getRowCount(UIData.java:356)
	at org.primefaces.component.api.UIData.calculateFirst(UIData.java:161)
	at org.primefaces.component.datatable.DataTableRenderer.preEncode(DataTableRenderer.java:107)
	at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:81)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1903)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1896)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1899)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1899)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1899)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:451)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:301)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:74)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1015)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652)
	at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1575)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1533)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:744)
Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: Modelo.ItemVendaRapida.vendarapida in Modelo.VendaRapida.vendasItens
	at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:708)
	at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:668)
	at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:69)
	at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1632)
	at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1390)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1777)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1861)
	at utility.HibernateUtility.<clinit>(HibernateUtility.java:96)
	... 66 more

O que pode ser isso?

É um erro bem simples, na verdade. Você chegou a ler como funciona o mappedBy?

Depois eu vi sobre o mappedBy e vi que tem que apontar para o nome do atributo e não para a classe mas já tentei de tudo nisso e não dá certo tbm.

Tenho certeza de que se você colocar o nome correto, se ainda houver erro, será outro :slight_smile:

nesse caso o nome do atributo tem que ser o nome do atributo da classe venda ou da classe item de venda?

A classe VendaRapida é que precisa ser corrigida.

se eu colocar assim está certo?

@OneToMany(mappedBy = "id", fetch = FetchType.LAZY, orphanRemoval=true, cascade = CascadeType.ALL) private List<ItemVendaRapida> vendasItens;

vi na net que muitos colocam no mappedBy o nome da classe tudo minusculo. Por exemplo: se a classe chama Acao colocam mypeedBy=“acao”. Então se for seguir o mesmo raciocinio o meu tem que ser assim:
nome da classe: VendaRapida;
nome no mappedBy=“vendarapida”.

Não seria assim?

Agora está dando erro no sistema inteiro. Até em uma classe que não tem chave estrangeira está dando o erro: Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags.

[quote=ViniciusGallo]Agora está dando erro no sistema inteiro. Até em uma classe que não tem chave estrangeira está dando o erro: Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags.[/quote]No mesmo post acima mostra como resolver esse problema.

Só que já fiz como está lá e não dá certo. Esse erro está travando o sistema inteiro.

Cara, você tem que ser mais específico. Não temos como opinar se não soubermos como você fez

Vou passar as michas classes VendaRapida, ItemVendaRapida, VendaRapida.xhtml, VendaRapidaDao, ItemVendaRapidaDao.
Classe VendaRapida

@Entity
@Table(name="vendarapida")
public class VendaRapida implements Serializable{
    
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Integer id;
    @Column(name="datarealizada")
    @Temporal(TemporalType.DATE)
    private Date datarealizada;
    @Temporal(TemporalType.TIME)   
    private Date hora;  
    @Column(name="formapagamento", length = 50)
    private String formapagamento;
    @Column(name="tipopagamento", length = 50)
    private String tipopagamento;
    @Column(name="precototal")
    private double precototal;
    @Column(name="precodesconto")
    private double precodesconto;
    @Column(name="precovenda")
    private double precovenda;
    @Column(name="observacao")
    private String observacao;
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "id")
    //@OneToMany(mappedBy = "id")
    //@LazyCollection(LazyCollectionOption.TRUE)
    private List<ItemVendaRapida> vendasItens;

    public VendaRapida() {
        this.vendasItens = new ArrayList<ItemVendaRapida>();
    }

    public VendaRapida(Integer id, Date datarealizada, Date hora, String formapagamento, String tipopagamento, double precototal, double precodesconto, double precovenda, String observacao, List<ItemVendaRapida> vendasItens) {
        this.id = id;
        this.datarealizada = datarealizada;
        this.hora = hora;
        this.formapagamento = formapagamento;
        this.tipopagamento = tipopagamento;
        this.precototal = precototal;
        this.precodesconto = precodesconto;
        this.precovenda = precovenda;
        this.observacao = observacao;
        this.vendasItens = vendasItens;
    }
    //gets e sets
}

Classe ItemVendaRapida

@Entity
@Table(name="itemvendarapida")
public class ItemVendaRapida implements Serializable{
    
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Integer id;
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "produto_id", nullable = true, insertable = false, updatable = false)
    private Produto produto;
    @ManyToOne
    @JoinColumn(name = "venda_id") 
    private VendaRapida venda;
    @Column(name="quantidade")
    private int quantidade;
    
    //get e set
}

Classe VendaRapidaDao:

public class VendaRapidaDao {
    
    private Session session;
    
    public void inserir(VendaRapida vendarapida){
        
        session = HibernateUtil.getSessionFactory().openSession();
 
        try{
            session.beginTransaction();
	    session.saveOrUpdate(vendarapida);
            session.getTransaction().commit();
        }finally{
            session.close();
	}
    }
    
    public void alterar(VendaRapida vendarapida){
        
        session = HibernateUtil.getSessionFactory().openSession();
 
        try{
            session = HibernateUtil.getSessionFactory().openSession();
            session.beginTransaction();
	    session.saveOrUpdate(vendarapida);
            session.getTransaction().commit();
        }finally{
            session.close();
	}
    }
    
    public void delete(VendaRapida vendarapida){
        
        session = HibernateUtil.getSessionFactory().openSession();
 
        try{
            session = HibernateUtil.getSessionFactory().openSession();
            session.beginTransaction();
	    session.delete(vendarapida);
            session.getTransaction().commit();
        }finally{
            session.close();
	}
    }
    
    @SuppressWarnings("unchecked")
    public List  listar(){
        
        session = HibernateUtil.getSessionFactory().openSession();
 
	try{
            Criteria cri = session.createCriteria(VendaRapida.class);
	    return cri.list();
	}finally{
	    session.close();
        }
    }
    
    public VendaRapida getById(Serializable id) {
        try {
            return (VendaRapida) HibernateUtil.getSessionFactory().openSession().load(VendaRapida.class, id);
        } catch (HibernateException hibernateException) {
            throw hibernateException;
        }
    }
    
}

Classe VendaRapidaBean (controller):

@ManagedBean
@SessionScoped
public class VendaRapidaBean implements Serializable{
    
    private ItemVendaRapida itemvenda = new ItemVendaRapida();
    private VendaRapida venda = new VendaRapida();
    private List vendas = new ArrayList();
    private List items = new ArrayList<ItemVendaRapida>();
    
    public VendaRapidaBean(){
        vendas = new VendaRapidaDao().listar();
        venda = new VendaRapida();
    }
    
    public void limparCampos(){
        venda.setDatarealizada(null);
        venda.setId(0);
        venda.setObservacao(null);
    }
    
    public void preencherItem(){
        items.add(itemvenda);
    }
    
    public void salvar(ActionEvent event) {
        if(venda.getVendasItens()== null ){
            venda.setVendasItens(new ArrayList<ItemVendaRapida>()); 
        }

        venda.getVendasItens().add(itemvenda);
        new VendaRapidaDao().inserir(venda); //metodo da JPA
        new ItemVendaRapidaDao().inserir(itemvenda);
    }
     
    public void recuperarVendaRapida(){
        venda = new VendaRapidaDao().getById(venda.getId());
    }
    
    public void excluir() {
        new VendaRapidaDao().delete(venda);
        vendas = new VendaRapidaDao().listar();
        venda = new VendaRapida();
    }
 
    public VendaRapida getVenda() {
        return venda;
    }
 
    public void setVenda(VendaRapida venda) {
        this.venda = venda;
    }
 
    public List getVendas() {
        return vendas;
    }
 
    public void setVendas(List vendas) {
        this.vendas = vendas;
    }

    public ItemVendaRapida getItemvenda() {
        return itemvenda;
    }

    public void setItemvenda(ItemVendaRapida itemvenda) {
        this.itemvenda = itemvenda;
    }
    
}

VendaRapida.xhtml:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition template="/Layout/Template.xhtml"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:h="http://xmlns.jcp.org/jsf/html"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:p="http://primefaces.org/ui">
    <ui:define name="conteudo">
        <h:body>
            <h:form style="border: #999999;">
                <p></p>
                <p:commandButton id="btnAbrirCadastroVenda" value="Abrir Cadastro" oncomplete="cadastrarVenda.show()"/>
            </h:form>
            <h:form id="formListar" style="border: #999999;">
                <p:dataTable id="tabela" selectionMode="single" selection="#{vendaRapidaBean.venda}" rowKey="#{vend.id}" value="#{vendaRapidaBean.vendas}" var="vend" emptyMessage="Nenhum registro incluido." paginator="true" rows="10">
                    <f:facet name="header">
                        LISTA DE VENDAS RÁPIDAS
                    </f:facet>
                    <p:column headerText="DATA REALIZADA" style="text-align: center">
                        <h:outputText value="#{vend.datarealizada}" />
                    </p:column>
                    <p:column headerText="HORA REALIZADA" style="text-align: center">
                        <h:outputText value="#{vend.hora}" />
                    </p:column>
                    <p:column headerText="FORMA PAG." style="text-align: center">
                        <h:outputText value="#{vend.formapagamento}" />
                    </p:column>
                    <p:column headerText="TIPO PAG." style="text-align: center">
                        <h:outputText value="#{vend.tipopagamento}" />
                    </p:column>
                    <p:column headerText="ALTERAR - EXCLUIR" style="text-align: center">
                        <p:commandButton action="#{vendaRapidaBean.recuperarVendaRapida()}" value="EDITAR" title="Editar" onclick="alterarVenda.show()" update=":formAlterarVenda"/>
                        <p:commandButton value="EXCLUIR" title="Excluir" onclick="confirmation.show()" style="margin-left: 5px"/>
                    </p:column>
                </p:dataTable>
            </h:form>
            <h:form id="dlg">
                <p:confirmDialog message="Deseja realmente excluir este registro?" hideEffect="explode" header="Aviso" severity="alert" widgetVar="confirmation">
                    <p:commandButton id="btnSim" value="Sim" oncomplete="confirmation.hide();" actionListener="#{vendaRapidaBean.excluir}" process="@(formListar)" update=":formListar:tabela"/>
                    <p:commandButton id="btnNao" value="Não" onclick="confirmation.hide();" type="button"/>
                </p:confirmDialog>
            </h:form>
            <p:dialog id="modalDialog" width="500" resizable="no" widgetVar="cadastrarVenda" header="CADASTRAR VENDA RÁPIDA" modal="true" height="600">
                <h:form id="formCadastroVenda">
                    <p:messages id="msgs" autoUpdate="true"/>
                    <h:panelGrid columns="2" cellpadding="4">
                        <h:outputLabel value="Data Realizada:" for="datarealizada"/>
                        <p:calendar value="#{vendaRapidaBean.venda.datarealizada}" id="popupCal"/>
                        
                        <h:outputLabel value="Hora Realizada:" for="hora"/>
                        <p:calendar value="#{vendaRapidaBean.venda.hora}" pattern="HH:mm" timeOnly="true" id="popupCalHora"/>
                        
                        <h:outputLabel value="Forma Pagamento:" for="formapagamento"></h:outputLabel>
                        <p:selectOneMenu id="formapagamento" label="formapagamento" value="#{vendaRapidaBean.venda.formapagamento}" maxlength="50" required="true">
                            <f:selectItem itemLabel="Cartão de Crédito" itemValue="Cartão de Crédito"/>  
                            <f:selectItem itemLabel="Cartão de Débito" itemValue="Cartão de Débito" />  
                            <f:selectItem itemLabel="Cheque" itemValue="Cheque" />  
                            <f:selectItem itemLabel="Dinheiro" itemValue="Dinheiro" />  
                        </p:selectOneMenu>
                        
                        <h:outputLabel value="Tipo Pagamento:" for="tipopagamento"></h:outputLabel>
                        <p:selectOneMenu id="tipopagamento" label="tipopagamento" value="#{vendaRapidaBean.venda.tipopagamento}" maxlength="50" required="true">
                            <f:selectItem itemLabel="A Vista" itemValue="A Vista" />  
                            <f:selectItem itemLabel="Parcelado" itemValue="Parcelado" />  
                        </p:selectOneMenu>
                        
                        <h:outputLabel value="Produto:" for="produto"/>
                        <p:selectOneMenu value="#{vendaRapidaBean.itemvenda.produto}" converter="bancoConverter" panelStyle="width:150px"  
                         effect="fade" var="p" style="width:160px"  filter="true" filterMatchMode="startsWith">  
                            <f:selectItem itemLabel="Selecione" itemValue=""/>
                            <f:selectItems value="#{produtoBean.produtos}" var="itens" itemValue="#{itens}" itemLabel="#{itens.nome}"/>
                            <p:column>
                                #{p.nome}
                            </p:column>
                            <p:column>
                                #{p.precovenda}
                            </p:column>
                            <p:column>
                                #{p.quantidade}
                            </p:column>
                        </p:selectOneMenu>
                        <h:outputLabel value="Quantidade:" for="quantidade"></h:outputLabel>
                        <h:inputText id="quantidade" value="#{vendaRapidaBean.itemvenda.quantidade}"/>
                        <h:outputLabel value="Total (R$):" for="total"></h:outputLabel>
                        <h:inputText id="total" value="#{vendaRapidaBean.venda.precototal}"/>
                        <h:outputLabel value="Desconto (R$):" for="desconto"></h:outputLabel>
                        <h:inputText id="desconto" value="#{vendaRapidaBean.venda.precodesconto}"/>
                        <h:outputLabel value="Preço da Venda (R$):" for="precovenda"></h:outputLabel>
                        <h:inputText id="precovenda" value="#{vendaRapidaBean.venda.precovenda}"/>
                        
                        <h:outputLabel value="Observação:" for="observacao"></h:outputLabel>
                        <p:inputTextarea id="observacao" label="observacao" value="#{vendaRapidaBean.venda.observacao}"/>
                    </h:panelGrid>
                    <p:commandButton id="btnSalvar" value="SALVAR" actionListener="#{vendaRapidaBean.salvar}"/>
                    <p:commandButton id="btnCancelar" value="FINALIZAR VENDA" oncomplete="cadastrarVenda.hide()" update=":formListar:tabela"/>
                </h:form>
            </p:dialog>
            <p:dialog id="alterar" width="500" resizable="no" widgetVar="alterarVenda" header="ALTERAR VENDA RÁPIDA" modal="true" height="600">
                <h:form id="formAlterarVenda">
                    <p:messages id="msgs" autoUpdate="true"/>
                    <h:panelGrid columns="2" cellpadding="4">
                        <h:outputLabel value="Data Realizada:" for="datarealizada"/>
                        <p:calendar value="#{vendaRapidaBean.venda.datarealizada}" id="popupCal"/>
                        
                        <h:outputLabel value="Hora Realizada:" for="hora"/>
                        <p:calendar value="#{vendaRapidaBean.venda.hora}" pattern="HH:mm" timeOnly="true" id="popupCalHora"/>
                        
                        <h:outputLabel value="Forma Pagamento:" for="formapagamento"></h:outputLabel>
                        <p:selectOneMenu id="formapagamento" label="formapagamento" value="#{vendaRapidaBean.venda.formapagamento}" maxlength="50" required="true">
                            <f:selectItem itemLabel="Cartão de Crédito" itemValue="Cartão de Crédito"/>  
                            <f:selectItem itemLabel="Cartão de Débito" itemValue="Cartão de Débito" />  
                            <f:selectItem itemLabel="Cheque" itemValue="Cheque" />  
                            <f:selectItem itemLabel="Dinheiro" itemValue="Dinheiro" />  
                        </p:selectOneMenu>
                        
                        <h:outputLabel value="Tipo Pagamento:" for="tipopagamento"></h:outputLabel>
                        <p:selectOneMenu id="tipopagamento" label="tipopagamento" value="#{vendaRapidaBean.venda.tipopagamento}" maxlength="50" required="true">
                            <f:selectItem itemLabel="A Vista" itemValue="A Vista" />  
                            <f:selectItem itemLabel="Parcelado" itemValue="Parcelado" />  
                        </p:selectOneMenu>
                        
                        <h:outputLabel value="Produto:" for="produto"/>
                        <p:selectOneMenu value="#{vendaRapidaBean.itemvenda.produto}" converter="bancoConverter" >
                            <f:selectItem itemLabel="Selecione" itemValue=""/>
                            <f:selectItems value="#{produtoBean.produtos}" var="itens" itemValue="#{itens}" itemLabel="#{itens.nome}"/>
                        </p:selectOneMenu>
                        <h:outputLabel value="Quantidade:" for="quantidade"></h:outputLabel>
                        <h:inputText id="quantidade" value="#{vendaRapidaBean.itemvenda.quantidade}"/>
                        <h:outputLabel value="Total (R$):" for="total"></h:outputLabel>
                        <h:inputText id="total" value="#{vendaRapidaBean.venda.precototal}"/>
                        <h:outputLabel value="Desconto (R$):" for="desconto"></h:outputLabel>
                        <h:inputText id="desconto" value="#{vendaRapidaBean.venda.precodesconto}"/>
                        <h:outputLabel value="Preço da Venda (R$):" for="precovenda"></h:outputLabel>
                        <h:inputText id="precovenda" value="#{vendaRapidaBean.venda.precovenda}"/>
                        
                        <h:outputLabel value="Observação:" for="observacao"></h:outputLabel>
                        <p:inputTextarea id="observacao" label="observacao" value="#{vendaRapidaBean.venda.observacao}"/>
                    </h:panelGrid>
                    <p:commandButton id="btnSalvar" value="ALTERAR" actionListener="#{vendaRapidaBean.salvar}"/>
                    <p:commandButton id="btnCancelar" value="FINALIZAR VENDA" oncomplete="alterarVenda.hide()" update=":formListar:tabela"/>
                </h:form>
            </p:dialog>
        </h:body>
    </ui:define>    
</ui:composition>

Eu sei que é longo mas isso está me custando um tempo enorme. Eu consigo salvar a venda no banco mas não consigo salvar os itens no banco porque não consigo pegar o id da venda que foi salva. A minha ideia é o usuario selecionar um produto na combo e salvar a venda e se tiver mais produto a ser vendido ele vai selecionando na combo e clicando em salvar.

Alguém tem alguma sugestão?