2016-02-27 48 views
0

我無法從我通過到一個寧靜Java客戶端的請求收到的實體檢索一對多列集合:一對多列返回空集合

Itinerary itinerary = port.checkItinerary_XML(Itinerary.class, from, to); 

的行程對象已檢索其所有數據,但當我嘗試檢索其一對多列我只得到一個空的集合:

Collection<Route> routeCollection = itinerary.getRouteCollection(); 

我試圖偷懶,渴望fetchtype但既不工作。

行程實體(相關部分):

@Entity 
@Table(name = "ITINERARY") 
@XmlRootElement 
@NamedQueries({ 
    @NamedQuery(name = "Itinerary.findAll", query = "SELECT i FROM Itinerary i"), 
    @NamedQuery(name = "Itinerary.findById", query = "SELECT i FROM Itinerary i WHERE i.id = :id"), 
    @NamedQuery(name = "Itinerary.findByStartCity", query = "SELECT i FROM Itinerary i WHERE i.startCity = :startCity"), 
    @NamedQuery(name = "Itinerary.findByEndCity", query = "SELECT i FROM Itinerary i WHERE i.endCity = :endCity")}) 
public class Itinerary implements Serializable { 
private static final long serialVersionUID = 1L; 
@Id 
@Basic(optional = false) 
@NotNull 
@Column(name = "ID") 
private Integer id; 
@OneToMany(fetch=FetchType.LAZY,cascade = CascadeType.ALL, mappedBy = "itineraryId") 
private Collection<Route> routeCollection= new ArrayList(); 

public Itinerary() { 
} 

public Itinerary(Integer id) { 
    this.id = id; 
} 


@XmlTransient 
@JsonIgnore 
public Collection<Route> getRouteCollection() { 
    return routeCollection; 
} 

public void setRouteCollection(Collection<Route> routeCollection) { 
    this.routeCollection = routeCollection; 
} 

路線實體(僅相關部分):

@Entity 
@Table(name = "ROUTE") 
@XmlRootElement 
@NamedQueries({ 
    @NamedQuery(name = "Route.findAll", query = "SELECT r FROM Route r"), 
    @NamedQuery(name = "Route.findById", query = "SELECT r FROM Route r WHERE r.id = :id"), 
    @NamedQuery(name = "Route.findByFromCity", query = "SELECT r FROM Route r WHERE r.fromCity = :fromCity"), 
    @NamedQuery(name = "Route.findByToCity", query = "SELECT r FROM Route r WHERE r.toCity = :toCity")}) 
public class Route implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @NotNull 
    @Column(name = "ID") 
    private Integer id; 
    @JoinColumn(name = "ITINERARY_ID", referencedColumnName = "ID") 
    @ManyToOne(fetch=FetchType.LAZY, cascade = CascadeType.ALL,optional = false) 
    private Itinerary itineraryId; 

    public Route() { 
    } 

    public Route(Integer id) { 
     this.id = id; 
    } 



    public Itinerary getItineraryId() { 
     return itineraryId; 
    } 

    public void setItineraryId(Itinerary itineraryId) { 
     this.itineraryId = itineraryId; 
    } 


} 

編輯:寧靜的行程客戶端處理checkItinerary_XML電話:

public class ItineraryClient { 
private WebTarget webTarget; 
private Client client; 
private static final String BASE_URI = "http://localhost:8080/id2208_hw3_server/webresources"; 

public <T> T checkItinerary_XML(Class<T> responseType, String departureCity, String destinationCity) throws ClientErrorException { 
    WebTarget resource = webTarget; 
    resource = resource.path(java.text.MessageFormat.format("checkItinerary/{0}/{1}", new Object[]{departureCity, destinationCity})); 
    return resource.request(javax.ws.rs.core.MediaType.APPLICATION_XML).get(responseType); 
} 
+0

好吧,getter用XmlTransient和JsonIgnore註釋,所以無論它是序列化爲XML還是JSON,編組器都會忽略該集合。 –

+0

你可以告訴我們你實際上檢索'Itinerary itinerary = port.checkItinerary_XML(Itinerary.class,from,to);'和'Collection routeCollection = itinerary.getRouteCollection();'的代碼嗎? – idipous

+0

@JB Nizet我試圖刪除它,但後來我得到了port.checkItinerary調用的內部服務器錯誤。我應該如何處理它? –

回答

0

如果您以交易方式檢索itinerary = port.checkItinerary_XML(Itinerary.class, from, to);,然後嘗試在事務之外的某個時間點獲得routeCollection,您將獲得一個空集合。

解決方法是在用於檢索iteneray的事務中進行調用。

+0

就像在我的端口對象中創建一個名爲getItineraryRouteCollection的新方法,我首先檢索行程對象,然後在檢索的對象上調用getRouteCollection並返回它? –

+0

我在主帖子中添加了行程檢索的代碼,以便您看到。 –

+0

好,以便了解。你從web服務中獲得一個'Itinerary'對象。爲什麼這個POJO應該知道你在數據庫中定義的'Route Collection'?換句話說,你所擁有的'語言'不受管理。正確或我錯過了什麼? – idipous