2013-11-26 14 views
6

Tôi đang thử một số ví dụ EJB3 in Action sử dụng Glassfish4 (EclipseLink) + JavaDB. Vì vậy, tôi có mối quan hệ bên dướiTìm nạp JPA @OneToMany bộ sưu tập trả về trống

@Entity 
@Table(name = "ITEMS") 
public class Item implements Serializable { 
    private static final long serialVersionUID = 1L; 

    private Long itemId; 
    ... 
    private List<Bid> bids= new ArrayList<>(); 

    @Id 
    @Column(name="ITEM_ID") 
    public Long getItemId() { 
     return itemId; 
    } 

    public void setItemId(Long itemId) { 
     this.itemId = itemId; 
    } 

    @OneToMany(mappedBy="item",fetch=FetchType.EAGER) 
    @JoinColumn(name="BID_ITEM_ID",referencedColumnName="ITEM_ID") 
    public List<Bid> getBids() { 
     return bids; 
    } 

    public void setBids(List<Bid> bids) { 
     this.bids = bids; 
    } 
} 

@Entity 
@Table(name="BIDS") 
public class Bid implements Serializable{ 
    private static final long serialVersionUID = 1L; 

    ... 
    private Item item;  
    ... 

    @Id 
    @Column(name="BID_ID") 
    public Long getBidId() { 
     return bidId; 
    } 

    public void setBidId(Long bidId) { 
     this.bidId = bidId; 
    } 

    @ManyToOne 
    @JoinColumn(name="BID_ITEM_ID",referencedColumnName="ITEM_ID") 
    public Item getItem() { 
     return item; 
    } 

    public void setItem(Item item) { 
     this.item = item; 
    }  
    ...   
} 

Bây giờ khi lấy một mục như

@Override 
public List<Bid> getBidsForItem(long itemId) { 
    Item item = em.find(Item.class, itemId); // em -> Entity manager 
    return item.getBids(); 
} 

các item.getBids() lợi nhuận một danh sách rỗng (size = 0, không null). Bạn nên thực hiện những thay đổi nào để nhận được Giá thầu cho Mặt hàng đã cho?

EDIT:
Sau khi kích hoạt ghi lại truy vấn như đề xuất trong các ý kiến ​​

<property name="eclipselink.logging.level.sql" value="FINE"/> 
<property name="eclipselink.logging.parameters" value="true"/> 

Tôi nhận thấy rằng truy vấn được liệt kê cho báo cáo chèn nhưng NO truy vấn được liệt kê tương ứng với em.find(Item.class, itemId).

EDIT 2 (ĐÁP):
Vấn đề là ở addBids của tôi() chức năng đậu không quốc tịch mà tôi đã đi qua một đối tượng Item. Điều này có nghĩa là Object Item không bao giờ trong bối cảnh liên tục. Cách đúng là để

  1. vượt qua ItemID
  2. tìm ra đối tượng mục với phương pháp quản lý thực thể find(). Điều này đảm bảo rằng đối tượng Item nằm trong bối cảnh persistence.
  3. thêm đối tượng giá thầu vào mục và mặt hàng để đặt giá thầu
  4. quản lý thực thể cuộc gọi tồn tại() trên Giá thầu.

addBids Corrected() phương pháp:

public Bid addBids(Date bidDate, Double bidPrice, long itemId, String bidder) { 
     Item item = em.find(Item.class, itemId); 
     Bid bid = new Bid(bidDate, bidPrice, item, bidder); 
     item.getBids().add(bid); 
     em.persist(bid); 
     return bid; 
} 

Nhờ @ Chris đã chỉ ra.

+0

Cơ sở dữ liệu có chứa dữ liệu thích hợp không? –

+0

@Kevin Bowersox - vâng. Nói mục có ITEM_ID = 100 có hai Giá thầu với BID_ID (5000, 5001) và BID_ITEM_ID = 100. –

+2

Tại sao bạn không xem các truy vấn SQL được thực hiện (google cách bật đăng nhập truy vấn trong EclipseLink)? Bạn có chắc là bạn sử dụng đúng DB hay như vậy ...? –

Trả lời

0

Hãy thử khởi tạo ArrayList<Bid> và gán nó cho tuyên bố List<Bid>.

@OneToMany(mappedBy="item") 
    protected List<Bid> bids = new ArrayList<Bid>(); 
+0

được thực hiện theo cách đó. Lưu ý rằng tôi đã đề cập đến kích thước danh sách kết quả là 0 và tham chiếu danh sách không phải là rỗng. Mà không gán một ArrayList tôi đã nhận được ngoại lệ con trỏ null. –

+0

@KiranMohan Bản đồ của bạn có vẻ chính xác, có thể đăng toàn bộ thực thể? –

+0

đã thêm toàn bộ thực thể –

1

Hãy thử điều này: -

public class Item{ 
private List<Bid> bids= new ArrayList<>(); 
public void setBids(List<Bid> bids) { 
    for (Bid bid : bids) { 
     bid.setItem(this); 
    } 
    this.bids = bids; 
} 

}

Ở đây bạn được giải phóng khách hàng để làm cho mối quan hệ. Làm đường vòng khác trong lớp Bid cũng. Nhưng hãy chắc chắn rằng bạn sẽ không kết thúc với các cuộc gọi phương thức vô hạn và fro. Và đó là cách tiếp cận tốt để cung cấp phương thức thêm và xóa. như: - public class Item{ private List<Bid> bids= new ArrayList<>(); public void addBid(Bid bid) { bid.setItem(this); this.bids.add(bids); } }

Các vấn đề liên quan