使用Primefaces和JPA持久保存主 - 细节模型的异常

时间:2015-04-09 05:32:34

标签: java jpa ejb master-detail

当我尝试持久保存主细节表单时,我正在尝试一些来自netbeans的奇怪日志消息,即使我尝试在java类上执行从对象写入数据的持久性。

我的应用程序有许多实体类,例如:

  1. 项目
  2. 提供商
  3. 类别
  4. 子类
  5. 订单(主)
  6. 细节(细节)
  7. 还有其他许多不必提的。这笔交易是我如何尝试将这些对象保持在主要面孔中。

    我的订单实体(The Master)看起来像这样:

    @Entity
    @Table(name = "tbl_orden_compra")
    @XmlRootElement
    @NamedQueries({
        @NamedQuery(name = "OrdenCompra.findAll", query = "SELECT o FROM OrdenCompra o"),
        @NamedQuery(name = "OrdenCompra.findByIdOrdenCompra", query = "SELECT o FROM OrdenCompra o WHERE o.idOrdenCompra = :idOrdenCompra"),
        @NamedQuery(name = "OrdenCompra.findByNumeroOrden", query = "SELECT o FROM OrdenCompra o WHERE o.numeroOrden = :numeroOrden"),
        @NamedQuery(name = "OrdenCompra.findByFechaOrden", query = "SELECT o FROM OrdenCompra o WHERE o.fechaOrden = :fechaOrden"),
        @NamedQuery(name = "OrdenCompra.findByFechaRecepcion", query = "SELECT o FROM OrdenCompra o WHERE o.fechaRecepcion = :fechaRecepcion"),
        @NamedQuery(name = "OrdenCompra.findByLugarEntrega", query = "SELECT o FROM OrdenCompra o WHERE o.lugarEntrega = :lugarEntrega"),
        @NamedQuery(name = "OrdenCompra.findByNumFactura", query = "SELECT o FROM OrdenCompra o WHERE o.numFactura = :numFactura"),
        @NamedQuery(name = "OrdenCompra.findByGranTotal", query = "SELECT o FROM OrdenCompra o WHERE o.granTotal = :granTotal")})
    public class OrdenCompra implements Serializable {
        private static final long serialVersionUID = 1L;
        @TableGenerator(name = "orden_sec",
                table = "tbl_sequence",
                pkColumnName = "SEQ_NAME",
                valueColumnName = "SEQ_COUNT",
                pkColumnValue = "orden_sec"
        )
        @Id
        @GeneratedValue(generator = "orden_sec")
        @Basic(optional = false)
        @NotNull
        @Column(name = "id_orden_compra")
        private Long idOrdenCompra;
        @Basic(optional = false)
        @NotNull
        @Size(min = 1, max = 5)
        @Column(name = "numero_orden")
        private String numeroOrden;
        @Basic(optional = false)
        @NotNull
        @Column(name = "fecha_orden")
        @Temporal(TemporalType.DATE)
        private Date fechaOrden;
        @Basic(optional = false)
        @NotNull
        @Column(name = "fecha_recepcion")
        @Temporal(TemporalType.DATE)
        private Date fechaRecepcion;
        @Basic(optional = false)
        @NotNull
        @Size(min = 1, max = 80)
        @Column(name = "lugar_entrega")
        private String lugarEntrega;
        @Basic(optional = false)
        @NotNull
        @Size(min = 1, max = 25)
        @Column(name = "num_factura")
        private String numFactura;
        // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
        @Basic(optional = false)
        @NotNull
        @Column(name = "gran_total")
        private BigDecimal granTotal;
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "idOrdenCompra")
        private List<DetalleOrdenCompra> detalleOrdenCompraList;
        @JoinColumn(name = "id_proyecto", referencedColumnName = "id_proyecto")
        @ManyToOne(optional = false)
        private Proyecto idProyecto;
        @JoinColumn(name = "id_provee", referencedColumnName = "id_provee")
        @ManyToOne(optional = false)
        private Proveedores idProvee;
    
        public OrdenCompra() {
        }
    
        public OrdenCompra(Long idOrdenCompra) {
            this.idOrdenCompra = idOrdenCompra;
        }
    
        public OrdenCompra(Long idOrdenCompra, String numeroOrden, Date fechaOrden, Date fechaRecepcion, String lugarEntrega, String numFactura, BigDecimal granTotal) {
            this.idOrdenCompra = idOrdenCompra;
            this.numeroOrden = numeroOrden;
            this.fechaOrden = fechaOrden;
            this.fechaRecepcion = fechaRecepcion;
            this.lugarEntrega = lugarEntrega;
            this.numFactura = numFactura;
            this.granTotal = granTotal;
        }
    
        //Getters And Setters
    }
    

    详细信息实体(详细信息)如下所示:

    @Entity
    @Table(name = "tbl_detalle_orden_compra")
    @XmlRootElement
    @NamedQueries({
        @NamedQuery(name = "DetalleOrdenCompra.findAll", query = "SELECT d FROM DetalleOrdenCompra d"),
        @NamedQuery(name = "DetalleOrdenCompra.findByIdDetalleCompra", query = "SELECT d FROM DetalleOrdenCompra d WHERE d.idDetalleCompra = :idDetalleCompra"),
        @NamedQuery(name = "DetalleOrdenCompra.findByCantidadItem", query = "SELECT d FROM DetalleOrdenCompra d WHERE d.cantidadItem = :cantidadItem"),
        @NamedQuery(name = "DetalleOrdenCompra.findByTotalItem", query = "SELECT d FROM DetalleOrdenCompra d WHERE d.totalItem = :totalItem"),
        @NamedQuery(name = "DetalleOrdenCompra.findByPrecio", query = "SELECT d FROM DetalleOrdenCompra d WHERE d.precio = :precio")})
    public class DetalleOrdenCompra implements Serializable {
        private static final long serialVersionUID = 1L;
        @TableGenerator(name = "detcomp_sec",
                table = "tbl_sequence",
                pkColumnName = "SEQ_NAME",
                valueColumnName = "SEQ_COUNT",
                pkColumnValue = "detcomp_sec"
        )
        @Id
        @GeneratedValue(generator = "detcomp_sec")
        @Basic(optional = false)
        @NotNull
        @Column(name = "id_detalle_compra")
        private Long idDetalleCompra;
        // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
        @Basic(optional = false)
        @NotNull
        @Column(name = "cantidad_item")
        private BigDecimal cantidadItem;
        @Basic(optional = false)
        @NotNull
        @Column(name = "total_item")
        private BigDecimal totalItem;
        @Basic(optional = false)
        @NotNull
        @Column(name = "precio")
        private BigDecimal precio;
        @JoinColumn(name = "id_orden_compra", referencedColumnName = "id_orden_compra")
        @ManyToOne(optional = false)
        private OrdenCompra idOrdenCompra;
        @JoinColumn(name = "id_item", referencedColumnName = "id_item")
        @ManyToOne(optional = false)
        private Items idItem;
    
        public DetalleOrdenCompra() {
        }
    
        public DetalleOrdenCompra(Long idDetalleCompra) {
            this.idDetalleCompra = idDetalleCompra;
        }
    
        public DetalleOrdenCompra(Long idDetalleCompra, BigDecimal cantidadItem, BigDecimal totalItem, BigDecimal precio) {
            this.idDetalleCompra = idDetalleCompra;
            this.cantidadItem = cantidadItem;
            this.totalItem = totalItem;
            this.precio = precio;
        }
    
        //Getters and Setters
    }
    

    在managedbean中我有这个实现:

    @ManagedBean(name="insumos_Controller")
    @SessionScoped
    public class Insumos_Controller {
        @EJB
        private OrdenCompraFacade ordenCompraFacade;
        @EJB
        private CalculoTotalItem calculoTotalItem;
        @EJB
        private ItemsFacade itemsFacade;
        @EJB
        private SubcategoriaFacade subcategoriaFacade;
        @EJB
        private CategoriasFacade categoriasFacade;
        @EJB
        private ProveedoresFacade proveedoresFacade;
        @EJB
        private ProyectoFacade proyectoFacade;
    
        //Decalaraciond e Variables
        private Proyecto selectedProyecto = new Proyecto();
        private Proveedores selectedProveedor = new Proveedores();
        private Categorias selectedCategoria = new Categorias();
        private Subcategoria selectedSubcategoria = new Subcategoria();
        private Items selectedMaterial = new Items();
        private OrdenCompra objOrdComp = new OrdenCompra();
        private DetalleOrdenCompra ojbDetOrdComp = new DetalleOrdenCompra();
    
        //Declaracion de Listas
        private List<Proyecto> listaProyectos = new ArrayList<Proyecto>();
        private List<Proveedores> listaProveedores = new ArrayList<Proveedores>();
        private List<Categorias> listaCategorias = new ArrayList<Categorias>();
        private List<Subcategoria> listaSubcategorias = new ArrayList<Subcategoria>();
        private List<Items> listaMateriales = new ArrayList<Items>();
        private List<DetalleOrdenCompra> dets = new ArrayList<DetalleOrdenCompra>();
        private DataModel<DetalleOrdenCompra> listaDetalle;
    
        //Contructor vacio
        public Insumos_Controller() {
        }
    
        //Metodos de programacion
    
        //Método que crea una lista de tipo Subcategorias filtrado por Categorias
        public String loadListaSubcategoxCatego() {
    
            List<Subcategoria> listaSubCategorias = new ArrayList<Subcategoria>();
            listaSubCategorias = subcategoriaFacade.consultarSubcatByCat(selectedCategoria);
            this.listaSubcategorias = listaSubCategorias;
            return "";
        }
        //Metodo que crea una lista detipo Material por Subcategorias
        public String loadListaItemsxSubcatego() {
    
            List<Items> listaItems = new ArrayList<Items>();
            listaItems = itemsFacade.consultarItemsBySubcat(selectedSubcategoria);
            this.listaMateriales = listaItems;
            return "";
        }
    
        //Metodo que agrega una linea a la lista de detalle de orden compra
    
        public String addDetalle() {
    
          //DetalleOrdenCompra det = new DetalleOrdenCompra(item.getIdDetalleCompra(),cantidadItem,totalItem,precio);
          dets.add(ojbDetOrdComp);
          //snuevoDetalle();
    
          //tsotalItem = calculoTotalItem.calculoTotalItem(det);
    
          return "";
        }
    
        public String deleteDetalle(DetalleOrdenCompra detalle) {
          dets.remove(detalle);     
          return "";
        }
        public BigDecimal getTotalITem() {
            BigDecimal totalItems = new BigDecimal("0.00");
            for(DetalleOrdenCompra d : dets) {
                totalItems = calculoTotalItem.calculoTotalItem(d);
                //ojbDetOrdComp.setTotalItem(calculoTotalItem.calculoTotalItem(d));
    
            }
            return totalItems;
        }
    
        //Getters y Setters
    
    
        public String nuevoDetalle(){
            ojbDetOrdComp = new DetalleOrdenCompra();
            //dt = new DetalleOrdenCompra();
            //dt.setDetalleMovimientoPK(new DetalleMovimientoPK());
            return "";
        }
    
         public String guardarCompra(){
            try {
    
    
    
                objOrdComp.setIdProyecto(selectedProyecto);
                // selected value from selectonemenu that display the list of providers
                objOrdComp.setIdProvee(selectedProveedor);
                // dets is the name of my arraylist type detail entity asigning the populated listin the form
                objOrdComp.setDetalleOrdenCompraList(dets);
                // at this point the master entity is filled (or setted)with all the needed onjects in its
                ordenCompraFacade.create(objOrdComp);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
    
             return"";
    
        }
    }
    

    所以实现非常简单,显然可能我使用了一些错误的实现来保持,但在其他形式我使用了那个逻辑......并且它工作正常。

    当我点击保存按钮时,glassfish日志会显示:

    Advertencia:   A system exception occurred during an invocation on EJB OrdenCompraFacade, method: public void com.comprasinventariopruebas.ejbs.AbstractFacade.create(java.lang.Object)
    Advertencia:   javax.ejb.EJBException
        at com.sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.java:748)
        at com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.java:698)
        at com.sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.java:503)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4566)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2074)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2044)
        at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:220)
        at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88)
        at com.sun.proxy.$Proxy486.create(Unknown Source)
        at com.comprasinventariopruebas.ejbs.__EJB31_Generated__OrdenCompraFacade__Intf____Bean__.create(Unknown Source)
        at com.comprasinventariopruebas.controladores.Insumos_Controller.guardarCompra(Insumos_Controller.java:265)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:4758)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4746)
        at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212)
        ... 50 more
    

0 个答案:

没有答案