当我尝试持久保存主细节表单时,我正在尝试一些来自netbeans的奇怪日志消息,即使我尝试在java类上执行从对象写入数据的持久性。
我的应用程序有许多实体类,例如:
还有其他许多不必提的。这笔交易是我如何尝试将这些对象保持在主要面孔中。
我的订单实体(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