public void create(Factura factura) {
   if (factura.getGastoList() == null) {
     factura.setGastoList(new ArrayList<Gasto>());
   }
   EntityManager em = null;
   try {
     em = getEntityManager();
     em.getTransaction().begin();
     Proveedor idproveedor = factura.getIdproveedor();
     if (idproveedor != null) {
       idproveedor = em.getReference(idproveedor.getClass(), idproveedor.getIdproveedor());
       factura.setIdproveedor(idproveedor);
     }
     Usuario idusuario = factura.getIdusuario();
     if (idusuario != null) {
       idusuario = em.getReference(idusuario.getClass(), idusuario.getIdusuario());
       factura.setIdusuario(idusuario);
     }
     List<Gasto> attachedGastoList = new ArrayList<Gasto>();
     for (Gasto gastoListGastoToAttach : factura.getGastoList()) {
       gastoListGastoToAttach =
           em.getReference(gastoListGastoToAttach.getClass(), gastoListGastoToAttach.getIdgasto());
       attachedGastoList.add(gastoListGastoToAttach);
     }
     factura.setGastoList(attachedGastoList);
     em.persist(factura);
     if (idproveedor != null) {
       idproveedor.getFacturaList().add(factura);
       idproveedor = em.merge(idproveedor);
     }
     if (idusuario != null) {
       idusuario.getFacturaList().add(factura);
       idusuario = em.merge(idusuario);
     }
     for (Gasto gastoListGasto : factura.getGastoList()) {
       Factura oldIdfacturaOfGastoListGasto = gastoListGasto.getIdfactura();
       gastoListGasto.setIdfactura(factura);
       gastoListGasto = em.merge(gastoListGasto);
       if (oldIdfacturaOfGastoListGasto != null) {
         oldIdfacturaOfGastoListGasto.getGastoList().remove(gastoListGasto);
         oldIdfacturaOfGastoListGasto = em.merge(oldIdfacturaOfGastoListGasto);
       }
     }
     em.getTransaction().commit();
   } finally {
     if (em != null) {
       em.close();
     }
   }
 }
 public void edit(Factura factura)
     throws IllegalOrphanException, NonexistentEntityException, Exception {
   EntityManager em = null;
   try {
     em = getEntityManager();
     em.getTransaction().begin();
     Factura persistentFactura = em.find(Factura.class, factura.getIdfactura());
     Proveedor idproveedorOld = persistentFactura.getIdproveedor();
     Proveedor idproveedorNew = factura.getIdproveedor();
     Usuario idusuarioOld = persistentFactura.getIdusuario();
     Usuario idusuarioNew = factura.getIdusuario();
     List<Gasto> gastoListOld = persistentFactura.getGastoList();
     List<Gasto> gastoListNew = factura.getGastoList();
     List<String> illegalOrphanMessages = null;
     for (Gasto gastoListOldGasto : gastoListOld) {
       if (!gastoListNew.contains(gastoListOldGasto)) {
         if (illegalOrphanMessages == null) {
           illegalOrphanMessages = new ArrayList<String>();
         }
         illegalOrphanMessages.add(
             "You must retain Gasto "
                 + gastoListOldGasto
                 + " since its idfactura field is not nullable.");
       }
     }
     if (illegalOrphanMessages != null) {
       throw new IllegalOrphanException(illegalOrphanMessages);
     }
     if (idproveedorNew != null) {
       idproveedorNew =
           em.getReference(idproveedorNew.getClass(), idproveedorNew.getIdproveedor());
       factura.setIdproveedor(idproveedorNew);
     }
     if (idusuarioNew != null) {
       idusuarioNew = em.getReference(idusuarioNew.getClass(), idusuarioNew.getIdusuario());
       factura.setIdusuario(idusuarioNew);
     }
     List<Gasto> attachedGastoListNew = new ArrayList<Gasto>();
     for (Gasto gastoListNewGastoToAttach : gastoListNew) {
       gastoListNewGastoToAttach =
           em.getReference(
               gastoListNewGastoToAttach.getClass(), gastoListNewGastoToAttach.getIdgasto());
       attachedGastoListNew.add(gastoListNewGastoToAttach);
     }
     gastoListNew = attachedGastoListNew;
     factura.setGastoList(gastoListNew);
     factura = em.merge(factura);
     if (idproveedorOld != null && !idproveedorOld.equals(idproveedorNew)) {
       idproveedorOld.getFacturaList().remove(factura);
       idproveedorOld = em.merge(idproveedorOld);
     }
     if (idproveedorNew != null && !idproveedorNew.equals(idproveedorOld)) {
       idproveedorNew.getFacturaList().add(factura);
       idproveedorNew = em.merge(idproveedorNew);
     }
     if (idusuarioOld != null && !idusuarioOld.equals(idusuarioNew)) {
       idusuarioOld.getFacturaList().remove(factura);
       idusuarioOld = em.merge(idusuarioOld);
     }
     if (idusuarioNew != null && !idusuarioNew.equals(idusuarioOld)) {
       idusuarioNew.getFacturaList().add(factura);
       idusuarioNew = em.merge(idusuarioNew);
     }
     for (Gasto gastoListNewGasto : gastoListNew) {
       if (!gastoListOld.contains(gastoListNewGasto)) {
         Factura oldIdfacturaOfGastoListNewGasto = gastoListNewGasto.getIdfactura();
         gastoListNewGasto.setIdfactura(factura);
         gastoListNewGasto = em.merge(gastoListNewGasto);
         if (oldIdfacturaOfGastoListNewGasto != null
             && !oldIdfacturaOfGastoListNewGasto.equals(factura)) {
           oldIdfacturaOfGastoListNewGasto.getGastoList().remove(gastoListNewGasto);
           oldIdfacturaOfGastoListNewGasto = em.merge(oldIdfacturaOfGastoListNewGasto);
         }
       }
     }
     em.getTransaction().commit();
   } catch (Exception ex) {
     String msg = ex.getLocalizedMessage();
     if (msg == null || msg.length() == 0) {
       Integer id = factura.getIdfactura();
       if (findFactura(id) == null) {
         throw new NonexistentEntityException("The factura with id " + id + " no longer exists.");
       }
     }
     throw ex;
   } finally {
     if (em != null) {
       em.close();
     }
   }
 }