1

私は互いに接続されている3つのクラスがあります。Order、OrderDetail、およびProduct。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)の両方に含まれています。それはなぜですか、どのように解決すればよいですか?3つのクラスが下に表示されます。OracleWeblogic10.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;
    }

}
4

2 に答える 2

0

「コードをJPAプロジェクトからEJBプロジェクトに移動する」という意味がわかりません。また、問題についてもう少し具体的に教えてください。オブジェクトがロードされていないと言う理由は何ですか?オブジェクトはどこにありますか? getOrderById() を呼び出すコード?

Web層にあると思われます。その場合、fetch typeに問題があるのではないかと思います。デフォルトでは、LAZY (対EAGER ) として定義されています。

これは、JPA が最初にルート オブジェクトのみをロードすることを意味します。JPAが他のリクエストを発行するのは、リンクされたオブジェクトにアクセスしようとするときです。これは開発者にとって透過的であり、重要な要件があります。それは、EJB 層にいる場合にのみ機能するということです。ルート オブジェクトを Web 層に戻した場合、それは「分離」され、JPA によって制御されなくなります。これは、依存オブジェクトがロードされていない場合、それらにアクセスするときに null 値を取得することを意味します (JPA がループから外れているため、フォローアップ要求は DB に送信されません)。

于 2012-11-11T14:54:19.387 に答える
0

どうやら、ejb の web.xml ファイルにトランザクション タイプ JTA を追加する必要がありました。

于 2012-11-09T06:59:33.653 に答える