2013-11-26 16 views
6

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

  • を通過

    1. です。これにより、Itemオブジェクトは永続コンテキストに確実に格納されます。
    2. 入札するアイテムとアイテムに入札オブジェクトを追加します。
    3. 入札時にエンティティマネージャの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; 
    } 
    

    感謝。

  • +0

    データベースには適切なデータが含まれていますか? –

    +0

    @Kevin Bowersox - はい。 ITEM_ID = 100のアイテムには、BID_ID(5000、5001)とBID_ITEM_ID = 100の2つの入札があります。 –

    +2

    実行されたSQLクエリ(Googleでは、EclipseLinkでクエリログを有効にする方法)を見てみませんか?正しいDBを使用していますか? –

    答えて

    0

    ArrayList<Bid>をインスタンス化し、List<Bid>宣言に割り当ててみてください。

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

    そのようにしました。結果リストのサイズが0であり、リスト参照がnullではないことに注意してください。 ArrayListを代入しないと、nullポインタ例外が発生しました。 –

    +0

    @KiranMohanあなたのマッピングは正しく見えますが、エンティティ全体を投稿するかもしれませんか? –

    +0

    全体エンティティが追加されました –

    1

    はこれを試してください: -

    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; 
    } 
    

    }

    ここではあなたが関係を作るために、クライアントを解放しています。もう一方はBidクラスでラウンドします。しかし、あなたは無限の方法の呼び出しで終わらないようにしてください。 これは、追加と削除の方法を提供する優れたアプローチです。 よう: - public class Item{ private List<Bid> bids= new ArrayList<>(); public void addBid(Bid bid) { bid.setItem(this); this.bids.add(bids); } }

    関連する問題