不是在ejb3中检索整个实体

时间:2012-11-07 05:32:12

标签: java ejb weblogic

我有三个相互连接的课程。订单,订单详细信息和产品。当我在我的JPA项目中执行以下操作时:

 @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;
    }

}

2 个答案:

答案 0 :(得分:0)

看来我必须将事务类型JTA添加到ejb的web.xml文件中。

答案 1 :(得分:0)

我不明白你的意思是“将代码从JPA项目转移到EJB项目。”而且,你能更具体地说明你的问题吗?是什么让你说对象没有加载?调用getOrderById()的代码在哪里?

我怀疑它在网络层。在这种情况下,我怀疑您可能遇到获取类型的问题。默认情况下,它定义为 LAZY (vs EAGER )。

这意味着JPA最初只会加载根对象。当您尝试访问链接对象时,JPA将发出其他请求。这对开发人员来说是透明的,有一个重要的要求:只有当你在EJB层时它才会起作用。如果您已将根对象返回到Web层,则它将“分离”并且不再受JPA控制。这意味着如果尚未加载依赖对象,则在访问它们时将获得空值(后续请求将不会发送到DB,因为JPA不在循环中)。