2013-11-26 10 views
6

मैं ग्लासफ़िश 4 (एक्लिप्ससेंक) + जावाडीबी का उपयोग कर कुछ EJB3 in Action उदाहरणों को आजमा रहा हूं। इसलिए मैं अब जब item.getBids() रिटर्न एक खाली सूची (आकार = 0, रिक्त नहीं) की तरहजेपीए प्राप्त करना @OneToMany संग्रह खाली

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

एक आइटम प्राप्त करते समय नीचे संबंध

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

है। दिए गए आइटम के लिए बोलियां प्राप्त करने के लिए क्या परिवर्तन किए जाने चाहिए?

संपादित करें:
के रूप में टिप्पणी

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

मैं देखा कि प्रश्नों डालने बयानों के लिए सूचीबद्ध किया गया है में सुझाव दिया है, लेकिन कोई क्वेरी em.find(Item.class, itemId) करने के लिए इसी सूचीबद्ध है क्वेरी लॉगिंग सक्षम करने के बाद।

संपादित 2 (उत्तर):
समस्या मेरी addBids में था() राज्यविहीन सेम समारोह जो मैं एक आइटम वस्तु गुजर रहा था करने के लिए। इसका मतलब है कि आइटम ऑब्जेक्ट लगातार संदर्भ में नहीं है। सही तरीके से Itemid

  • पारित इकाई प्रबंधक खोज() विधि के साथ आइटम इकाई को खोजने

    1. है। यह सुनिश्चित करता है कि आइटम ऑब्जेक्ट दृढ़ता संदर्भ में है।
    2. बोली पर
    3. बोली इकाई प्रबंधक प्रबंधक() बोली लगाने के लिए आइटम और आइटम पर बोली वस्तु जोड़ें।

    सही addBids() विधि: उनका कहना है के लिए @Chris को

    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

    @ केविन बॉवर्सॉक्स - हाँ। ITEM_ID = 100 के साथ आइटम कहें BID_ID (5000, 5001) और BID_ITEM_ID = 100 के साथ दो बोलियां हैं। –

    +2

    आप निष्पादित SQL क्वेरी क्यों नहीं देखते हैं (Google EclipseLink में क्वेरी लॉगिंग को सक्षम करने के लिए कैसे करें)? क्या आप वाकई सही डीबी का उपयोग करते हैं या तो ...? –

    उत्तर

    0

    ArrayList<Bid> को तुरंत चालू करने और List<Bid> घोषणा को असाइन करने का प्रयास करें।

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

    खोजते हैं। ध्यान दें कि मैंने परिणाम सूची आकार का उल्लेख किया है 0 और सूची संदर्भ शून्य नहीं है। एक ArrayList असाइन किए बिना मैं शून्य सूचक अपवाद प्राप्त कर रहा था। –

    +0

    @ किरणमोहन आपका मानचित्रण सही दिखता है, शायद पूरी इकाई पोस्ट कर सकता है? –

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

    }

    यहाँ आप ग्राहक को मुक्त कर रहे हैं संबंध बनाने के लिए। बिड क्लास में दूसरी तरफ भी करें। लेकिन सुनिश्चित करें कि आप अनंत कॉल और फॉर विधि कॉल के साथ समाप्त नहीं होंगे। और यह एक जोड़ने और हटाने विधि प्रदान करने के लिए एक अच्छा तरीका है। जैसे: - public class Item{ private List<Bid> bids= new ArrayList<>(); public void addBid(Bid bid) { bid.setItem(this); this.bids.add(bids); } }

    संबंधित मुद्दे