2012-11-07 25 views
1

我有三個相互連接的類。訂單,OrderDetail和產品。當我在我的JPA項目中做如下工作時:未在ejb3中檢索整個實體

@Override 
    public Order getOrderById(String orderID) { 
     Order order = (Order) 

      em.createQuery("select A from Order A where A.orderId = ?1") 
      .setParameter(1, orderID) 
      .getSingleResult(); 
     return order;  
    } 

所有的信息都被檢索到。但是,當我將它移動到ebj項目時。我只得到訂單,就是這樣。然而,所有類都包含在兩個persistence.xml文件(JPA和ejb3)中。爲什麼是這樣的,我應該如何解決它?這三個類都顯示在下面。我正在使用Oracle Weblogic 10.3.3。我嘗試重新啓動並清除服務器,但沒有奏效。

*package eshop; 

import java.io.Serializable; 
import javax.persistence.*; 
import java.util.ArrayList; 
import java.util.List;* 


/** 
* The persistent class for the orders database table. 
* 
*/ 
@Entity 
@Table(name="orders") 
public class Order implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name="order_id") 
    private String orderId; 

    @Column(name="cc_expiry") 
    private String ccExpiry; 

    @Column(name="cc_name") 
    private String ccName; 

    @Column(name="cc_number") 
    private String ccNumber; 

    @Column(name="delivery_address") 
    private String deliveryAddress; 

    @Column(name="delivery_name") 
    private String deliveryName; 

    @Column(name="delivery_surname") 
    private String deliverySurname; 

    private String status; 

    //bi-directional many-to-one association to OrderDetail 
    @OneToMany(mappedBy="order", cascade=CascadeType.PERSIST) 
    private List<OrderDetail> orderDetails = new ArrayList<OrderDetail>(); 

    public void addOrUpdateOrderDetail(Product product) { 
     this.orderDetails.add(new OrderDetail(product)); 


    } 







    public Order() { 
    } 

    public String getOrderId() { 
     return this.orderId; 
    } 

    public void setOrderId(String orderId) { 
     this.orderId = orderId; 
    } 

    public String getCcExpiry() { 
     return this.ccExpiry; 
    } 

    public void setCcExpiry(String ccExpiry) { 
     this.ccExpiry = ccExpiry; 
    } 

    public String getCcName() { 
     return this.ccName; 
    } 

    public void setCcName(String ccName) { 
     this.ccName = ccName; 
    } 

    public String getCcNumber() { 
     return this.ccNumber; 
    } 

    public void setCcNumber(String ccNumber) { 
     this.ccNumber = ccNumber; 
    } 

    public String getDeliveryAddress() { 
     return this.deliveryAddress; 
    } 

    public void setDeliveryAddress(String deliveryAddress) { 
     this.deliveryAddress = deliveryAddress; 
    } 

    public String getDeliveryName() { 
     return this.deliveryName; 
    } 

    public void setDeliveryName(String deliveryName) { 
     this.deliveryName = deliveryName; 
    } 

    public String getDeliverySurname() { 
     return this.deliverySurname; 
    } 

    public void setDeliverySurname(String deliverySurname) { 
     this.deliverySurname = deliverySurname; 
    } 

    public String getStatus() { 
     return this.status; 
    } 

    public void setStatus(String status) { 
     this.status = status; 
    } 

    public List<OrderDetail> getOrderDetails() { 
     return this.orderDetails; 
    } 

    public void setOrderDetails(List<OrderDetail> orderDetails) { 
     this.orderDetails = orderDetails; 
    } 

} 


package eshop; 

import java.io.Serializable; 
import javax.persistence.*; 
import java.math.BigDecimal; 


/** 
* The persistent class for the order_details database table. 
* 
*/ 
@Entity 
@Table(name="order_details") 
public class OrderDetail implements Serializable { 
    private static final long serialVersionUID = 1L; 

@GeneratedValue(strategy=GenerationType.AUTO) 
private int id; 

private BigDecimal price; 

private int quantity; 

//bi-directional many-to-one association to Order 
@ManyToOne 
@JoinColumn(name="order_id") 
private Order order; 

//bi-directional many-to-one association to Product 
@ManyToOne 
@JoinColumn(name="product_id") 
private Product product; 

@Id 
private int product_id; 

public OrderDetail() { 
} 

public OrderDetail (Integer ProductId,Product product,Integer productQuantity,BigDecimal price, Order order) { 
     this.price= price; 
     this.product_id = ProductId; 
     this.product = product; 
     this.quantity = productQuantity; 
     this.order = order; 
     } 

    public OrderDetail(Product product1) { 
    product_id = product1.getCategoryId(); 
    price = product1.getPrice(); 
    quantity = 1; 
    product = product1; 

    } 

    public int getId() { 
     return this.id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public BigDecimal getPrice() { 
     return this.price; 
    } 

    public void setPrice(BigDecimal price) { 
     this.price = price; 
    } 

    public int getQuantity() { 
     return this.quantity; 
    } 

    public void setQuantity(int quantity) { 
     this.quantity = quantity; 
    } 

    public Order getOrder() { 
     return this.order; 
    } 

    public void setOrder(Order order) { 
     this.order = order; 
    } 

    public Product getProduct() { 
     return this.product; 
    } 

    public void setProduct(Product product) { 
     this.product = product; 
    } 

    public int getProduct_id() { 
     return product_id; 
    } 

    public void setProduct_id(int product_id) { 
     this.product_id = product_id; 
    } 

} 

package eshop; 

import java.io.Serializable; 
import javax.persistence.*; 
import java.math.BigDecimal; 


/** 
* The persistent class for the products database table. 
* 
*/ 
@Entity 
@Table(name="products") 
public class Product implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name="product_id") 
    private int productId; 

    @Column(name="category_id") 
    private int categoryId; 

    @Lob 
    private String descr; 

    private BigDecimal price; 

    @Column(name="product_name") 
    private String productName; 

    private int quantity; 

    public Product() { 
    } 

    public int getProductId() { 
     return this.productId; 
    } 

    public void setProductId(int productId) { 
     this.productId = productId; 
    } 

    public int getCategoryId() { 
     return this.categoryId; 
    } 

    public void setCategoryId(int categoryId) { 
     this.categoryId = categoryId; 
    } 

    public String getDescr() { 
     return this.descr; 
    } 

    public void setDescr(String descr) { 
     this.descr = descr; 
    } 

    public BigDecimal getPrice() { 
     return this.price; 
    } 

    public void setPrice(BigDecimal price) { 
     this.price = price; 
    } 

    public String getProductName() { 
     return this.productName; 
    } 

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

    public int getQuantity() { 
     return this.quantity; 
    } 

    public void setQuantity(int quantity) { 
     this.quantity = quantity; 
    } 

} 

回答

0

因爲看起來我不得不將事務類型JTA添加到ejb的web.xml文件。

0

我不明白「將代碼從JPA項目移動到EJB項目」是什麼意思。此外,您是否可以更具體地瞭解您的問題?是什麼讓您說沒有加載對象?如果是調用getOrderById代碼()?

我懷疑這是在Web層。在這種情況下,我懷疑你可能與問題提取類型。默認情況下,它被定義作爲LAZY(vs EAGER)。

這意味着JPA最初只會加載t他是根對象。當您嘗試訪問JPA將發出其他請求的鏈接對象時。這對開發人員來說是透明的,一個重要的要求是:只有當你在EJB層時才能工作。如果您已將根對象返回到Web層,則它將被「分離」並且不再受JPA控制。這意味着如果依賴對象尚未加載,那麼在訪問它們時會得到空值(後續請求不會發送到數據庫,因爲JPA不在循環中)。