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
- passare l'itemId
- trovare l'entità del lotto con il metodo del gestore di entità find(). Ciò garantisce che l'oggetto Item sia nel contesto di persistenza.
- aggiungi oggetto oggetto all'articolo e articolo a offerta
- 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.
Il database contiene i dati appropriati? –
@Kevin Bowersox - sì. Dì articolo con ITEM_ID = 100 ha due offerte con BID_ID (5000, 5001) e BID_ITEM_ID = 100. –
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ì ...? –