2013-11-26 10 views
6

Sto provando alcuni esempi EJB3 in Action utilizzando Glassfish4 (EclipseLink) + JavaDB. Così ho il rapporto sottoRecupero JPA @OneToLa collezione restituisce vuoto

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

Ora, quando il recupero di un elemento come

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

le item.getBids() restituisce una lista vuota (size = 0, non nullo). Quali modifiche dovrebbero essere fatte per ottenere offerte per l'articolo dato?

EDIT:
Dopo aver abilitato la registrazione di query come suggerito nei commenti

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

Ho notato che le query sono elencati per le istruzioni INSERT, ma nessuna query è elencato corrispondente a em.find(Item.class, itemId).

EDIT 2 (RISPOSTA):
Il problema era nella mia addBids() funzione di bean senza stato a cui stava passando un oggetto Item. Ciò significava che l'Oggetto Oggetto non è mai nel contesto persistente. Il modo giusto è quello di

  1. passare l'itemId
  2. trovare l'entità del lotto con il metodo del gestore di entità find(). Ciò garantisce che l'oggetto Item sia nel contesto di persistenza.
  3. aggiungi oggetto oggetto all'articolo e articolo a offerta
  4. gestore di entità chiamata persist() su offerta.

addBids corretti() metodo:

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

Grazie a @ Chris per aver ricordato.

+0

Il database contiene i dati appropriati? –

+0

@Kevin Bowersox - sì. Dì articolo con ITEM_ID = 100 ha due offerte con BID_ID (5000, 5001) e BID_ITEM_ID = 100. –

+2

Perché non si guardano le query SQL eseguite (come abilitare la registrazione delle query in EclipseLink)? Sei sicuro di usare il DB corretto o così ...? –

risposta

0

Provare a istanziare uno ArrayList<Bid> e assegnarlo alla dichiarazione List<Bid>.

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

fatta in quel modo. Si noti che ho menzionato la dimensione dell'elenco dei risultati è 0 e il riferimento alla lista non è nullo. Senza assegnare un ArrayList stavo ottenendo eccezione puntatore nullo. –

+0

@KiranMohan La mappatura sembra corretta, forse pubblica l'intera entità? –

+0

aggiunto intera entità –

1

Prova questa: -

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

}

Qui stanno liberando il cliente per rendere il rapporto. Fai anche il giro alternativo in classe di offerte. Ma assicurati di non finire con infinite chiamate di metodo "avanti e indietro". E rappresenta un buon approccio per fornire un metodo di aggiunta e rimozione. come: - public class Item{ private List<Bid> bids= new ArrayList<>(); public void addBid(Bid bid) { bid.setItem(this); this.bids.add(bids); } }

Problemi correlati