Glassfish4(EclipseLink)+ JavaDBを使用して、いくつかのEJB3 in Actionサンプルを試しています。だから私は、下記の関係JPA @OneToManyコレクションを取得すると空が返される
@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;
}
...
}
は今
@Override
public List<Bid> getBidsForItem(long itemId) {
Item item = em.find(Item.class, itemId); // em -> Entity manager
return item.getBids();
}
のような項目
item.getBids()
を取得する際には、空のリスト(サイズ= 0、NOT NULL)を返してきました。特定のアイテムの入札単価を取得するには、どのような変更を行う必要がありますか?
EDIT:
コメントで
<property name="eclipselink.logging.level.sql" value="FINE"/>
<property name="eclipselink.logging.parameters" value="true"/>
を示唆するように、クエリログを有効にした後、私は、クエリは、挿入文に記載されていますが、クエリがem.find(Item.class, itemId)
に対応する表示されていないことに注意してください。
EDIT 2(ANSWER):
問題が(私のaddBidsであった)私はアイテムオブジェクトを通過したステートレスビーン機能。これは、Itemオブジェクトが永続コンテキストに決して存在しないことを意味していました。正しい方法は、エンティティマネージャのfind()メソッドを使用してアイテムのエンティティを見つけるのitemId
- です。これにより、Itemオブジェクトは永続コンテキストに確実に格納されます。
- 入札するアイテムとアイテムに入札オブジェクトを追加します。
- 入札時にエンティティマネージャのpersist()を呼び出します。
修正しaddBids()メソッド:指摘し@クリスへ
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;
}
感謝。
データベースには適切なデータが含まれていますか? –
@Kevin Bowersox - はい。 ITEM_ID = 100のアイテムには、BID_ID(5000、5001)とBID_ITEM_ID = 100の2つの入札があります。 –
実行されたSQLクエリ(Googleでは、EclipseLinkでクエリログを有効にする方法)を見てみませんか?正しいDBを使用していますか? –