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à để
- vượt qua ItemID
- 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.
- thêm đối tượng giá thầu vào mục và mặt hàng để đặt giá thầu
- 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.
Cơ sở dữ liệu có chứa dữ liệu thích hợp không? –
@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. –
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 ...? –