我有三个相互连接的课程。订单,订单详细信息和产品。当我在我的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;
}
}
答案 0 :(得分:0)
看来我必须将事务类型JTA添加到ejb的web.xml文件中。
答案 1 :(得分:0)
我不明白你的意思是“将代码从JPA项目转移到EJB项目。”而且,你能更具体地说明你的问题吗?是什么让你说对象没有加载?调用getOrderById()的代码在哪里?
我怀疑它在网络层。在这种情况下,我怀疑您可能遇到获取类型的问题。默认情况下,它定义为 LAZY (vs EAGER )。
这意味着JPA最初只会加载根对象。当您尝试访问链接对象时,JPA将发出其他请求。这对开发人员来说是透明的,有一个重要的要求:只有当你在EJB层时它才会起作用。如果您已将根对象返回到Web层,则它将“分离”并且不再受JPA控制。这意味着如果尚未加载依赖对象,则在访问它们时将获得空值(后续请求将不会发送到DB,因为JPA不在循环中)。