2012-01-19 40 views
0

我不能將@PersistenceContext與我創建的新bean一起使用,結果始終是實體管理器變量爲null。使用EntityManager和EntityManagerFactory投射實體對象的異常

所以我搜索了網絡爲這個問題的解決方案,沒有結果。 相反,我嘗試使用EntityManagerFactory完美返回數據,但我不能將其轉移到相同實體類型的新變量。

我注意到,l.get(0)的內容除了普通的Products對象字段外,還有一些額外的類似於_persistence_listener,_persistence_primaryKey等等,然後轉換不成功。

如何將結果再次投射到Products對象而不會拋出異常「com.jogogestao.entity.Product不能轉換爲com.jogogestao.entity.Product」?

Tkx!

驗證碼:

public Product getProduct (int ProductId){ 
     private EntityManager em; 
    private static EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory("JogoGestao-ejbPU"); 
     Product p = null; 

     em = emf.createEntityManager(); 
     Query querysql = em.createQuery("select p from Product p where p.idProduct=" + ProductId); 
     List<Product> l = querysql.getResultList(); 
     p=l.get(0); //The error occurs here 
} 

Product.java:

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package com.jogogestao.entity; 

import java.io.Serializable; 
import java.math.BigDecimal; 
import java.util.Date; 
import javax.persistence.Basic; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.NamedQueries; 
import javax.persistence.NamedQuery; 
import javax.persistence.Table; 
import javax.persistence.Temporal; 
import javax.persistence.TemporalType; 
import javax.validation.constraints.NotNull; 
import javax.validation.constraints.Size; 
import javax.xml.bind.annotation.XmlRootElement; 

/** 
* 
* @author BirdOfPrey 
*/ 
@Entity 
@Table(name = "product") 
@XmlRootElement 
@NamedQueries({ 
    @NamedQuery(name = "Product.findAll", query = "SELECT p FROM Product p"), 
    @NamedQuery(name = "Product.findByIdProduct", query = "SELECT p FROM Product p WHERE p.idProduct = :idProduct"), 
    @NamedQuery(name = "Product.findByProductName", query = "SELECT p FROM Product p WHERE p.productName = :productName"), 
    @NamedQuery(name = "Product.findByProductBuyPrice", query = "SELECT p FROM Product p WHERE p.productBuyPrice = :productBuyPrice"), 
    @NamedQuery(name = "Product.findByProductSellPrice", query = "SELECT p FROM Product p WHERE p.productSellPrice = :productSellPrice"), 
    @NamedQuery(name = "Product.findByProductStoreStockQtd", query = "SELECT p FROM Product p WHERE p.productStoreStockQtd = :productStoreStockQtd"), 
    @NamedQuery(name = "Product.findByProductShelfSpace", query = "SELECT p FROM Product p WHERE p.productShelfSpace = :productShelfSpace"), 
    @NamedQuery(name = "Product.findByProductSubCategoryId", query = "SELECT p FROM Product p WHERE p.productSubCategoryId = :productSubCategoryId"), 
    @NamedQuery(name = "Product.findByProductStoreRefillTime", query = "SELECT p FROM Product p WHERE p.productStoreRefillTime = :productStoreRefillTime"), 
    @NamedQuery(name = "Product.findByProductStoreCentralQtd", query = "SELECT p FROM Product p WHERE p.productStoreCentralQtd = :productStoreCentralQtd"), 
    @NamedQuery(name = "Product.findByProductStoreWarehouseQtd", query = "SELECT p FROM Product p WHERE p.productStoreWarehouseQtd = :productStoreWarehouseQtd"), 
    @NamedQuery(name = "Product.findByProductRange", query = "SELECT p FROM Product p WHERE p.productRange = :productRange"), 
    @NamedQuery(name = "Product.findByProductWarehouseResponseTime", query = "SELECT p FROM Product p WHERE p.productWarehouseResponseTime = :productWarehouseResponseTime"), 
    @NamedQuery(name = "Product.findByProductCentralResponseTime", query = "SELECT p FROM Product p WHERE p.productCentralResponseTime = :productCentralResponseTime")}) 
public class Product implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @NotNull 
    @Column(name = "idProduct") 
    private Integer idProduct; 
    @Size(max = 5000) 
    @Column(name = "ProductName") 
    private String productName; 
    // @Max(value=?) @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation 
    @Column(name = "ProductBuyPrice") 
    private BigDecimal productBuyPrice; 
    @Column(name = "ProductSellPrice") 
    private BigDecimal productSellPrice; 
    @Column(name = "ProductStoreStockQtd") 
    private Integer productStoreStockQtd; 
    @Column(name = "ProductShelfSpace") 
    private Integer productShelfSpace; 
    @Size(max = 100) 
    @Column(name = "ProductSubCategoryId") 
    private String productSubCategoryId; 
    @Column(name = "ProductStoreRefillTime") 
    @Temporal(TemporalType.TIME) 
    private Date productStoreRefillTime; 
    @Column(name = "ProductStoreCentralQtd") 
    private Integer productStoreCentralQtd; 
    @Column(name = "ProductStoreWarehouseQtd") 
    private Integer productStoreWarehouseQtd; 
    @Column(name = "ProductRange") 
    private Integer productRange; 
    @Column(name = "ProductWarehouseResponseTime") 
    @Temporal(TemporalType.TIME) 
    private Date productWarehouseResponseTime; 
    @Column(name = "ProductCentralResponseTime") 
    @Temporal(TemporalType.TIME) 
    private Date productCentralResponseTime; 
    @JoinColumn(name = "ProductCategoryId", referencedColumnName = "idProductCategory") 
    @ManyToOne 
    private Productcategory productCategoryId; 

    public Product() { 
    } 

    public Product(Integer idProduct) { 
     this.idProduct = idProduct; 
    } 

    public Integer getIdProduct() { 
     return idProduct; 
    } 

    public void setIdProduct(Integer idProduct) { 
     this.idProduct = idProduct; 
    } 

    public String getProductName() { 
     return productName; 
    } 

    public void setProductName(String productName) { 
     this.productName = productName; 
    } 

    public BigDecimal getProductBuyPrice() { 
     return productBuyPrice; 
    } 

    public void setProductBuyPrice(BigDecimal productBuyPrice) { 
     this.productBuyPrice = productBuyPrice; 
    } 

    public BigDecimal getProductSellPrice() { 
     return productSellPrice; 
    } 

    public void setProductSellPrice(BigDecimal productSellPrice) { 
     this.productSellPrice = productSellPrice; 
    } 

    public Integer getProductStoreStockQtd() { 
     return productStoreStockQtd; 
    } 

    public void setProductStoreStockQtd(Integer productStoreStockQtd) { 
     this.productStoreStockQtd = productStoreStockQtd; 
    } 

    public Integer getProductShelfSpace() { 
     return productShelfSpace; 
    } 

    public void setProductShelfSpace(Integer productShelfSpace) { 
     this.productShelfSpace = productShelfSpace; 
    } 

    public String getProductSubCategoryId() { 
     return productSubCategoryId; 
    } 

    public void setProductSubCategoryId(String productSubCategoryId) { 
     this.productSubCategoryId = productSubCategoryId; 
    } 

    public Date getProductStoreRefillTime() { 
     return productStoreRefillTime; 
    } 

    public void setProductStoreRefillTime(Date productStoreRefillTime) { 
     this.productStoreRefillTime = productStoreRefillTime; 
    } 

    public Integer getProductStoreCentralQtd() { 
     return productStoreCentralQtd; 
    } 

    public void setProductStoreCentralQtd(Integer productStoreCentralQtd) { 
     this.productStoreCentralQtd = productStoreCentralQtd; 
    } 

    public Integer getProductStoreWarehouseQtd() { 
     return productStoreWarehouseQtd; 
    } 

    public void setProductStoreWarehouseQtd(Integer productStoreWarehouseQtd) { 
     this.productStoreWarehouseQtd = productStoreWarehouseQtd; 
    } 

    public Integer getProductRange() { 
     return productRange; 
    } 

    public void setProductRange(Integer productRange) { 
     this.productRange = productRange; 
    } 

    public Date getProductWarehouseResponseTime() { 
     return productWarehouseResponseTime; 
    } 

    public void setProductWarehouseResponseTime(Date productWarehouseResponseTime) { 
     this.productWarehouseResponseTime = productWarehouseResponseTime; 
    } 

    public Date getProductCentralResponseTime() { 
     return productCentralResponseTime; 
    } 

    public void setProductCentralResponseTime(Date productCentralResponseTime) { 
     this.productCentralResponseTime = productCentralResponseTime; 
    } 

    public Productcategory getProductCategoryId() { 
     return productCategoryId; 
    } 

    public void setProductCategoryId(Productcategory productCategoryId) { 
     this.productCategoryId = productCategoryId; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (idProduct != null ? idProduct.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     // TODO: Warning - this method won't work in the case the id fields are not set 
     if (!(object instanceof Product)) { 
      return false; 
     } 
     Product other = (Product) object; 
     if ((this.idProduct == null && other.idProduct != null) || (this.idProduct != null && !this.idProduct.equals(other.idProduct))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "com.jogogestao.entity.Product[ idProduct=" + idProduct + " ]"; 
    } 

} 

錯誤:

Caused by: java.lang.ClassCastException: com.jogogestao.entity.Product cannot be cast to com.jogogestao.entity.Product 
    at com.jogogestao.ejb.DataAccess.getProduct(DataAccess.java:57) 
    at com.jogogestao.ejb.JogoGestaoSession.addProduct(JogoGestaoSession.java:67) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052) 
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124) 
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5366) 
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619) 
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800) 
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571) 
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162) 
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144) 
    at sun.reflect.GeneratedMethodAccessor199.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861) 
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800) 
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:370) 
    at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5338) 
    at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5326) 
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:214) 
    ... 47 more 

回答

1

不知何故,你的類加載問題。 List<Product> l = querysql.getResultList();產品在加載diffirent類加載器,然後您的代碼。我認爲這個問題是在這裏private static EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory("JogoGestao-ejbPU");

  1. 嘗試從你的代碼(不是在靜態動初始化)獲取的EntityManagerFactory,看看問題是否已經解決。

  2. 檢查如何定義Persistance的使用以及正在使用哪個classloader。我認爲問題在於使用錯誤的類加載器來加載javax.persistence.*類。

0

如果方法getProduct處於servletManagedBeanEJB,讓容器通過注射管理PersistenceContext的生命週期:

@PersistenceContext private EntityManager em; 

如果持久性單元在您persistence.xml正確定義和在容器中,這已經足夠了。

爲了瞭解企業Bean的使用情況,請仔細閱讀Java EE 6 Tutorial

+0

很奇怪的東西與在GlassFish服務器上該項目發生的事情,所以我用一個新名稱和完全相同的代碼重建整個項目現在工作好吧...去圖 – BirdOfPrey