簡體   English   中英

遠程訪問Jpa實體

[英]Remote Access To Jpa Entity

我目前正在使用由Java Web應用程序和C#客戶端應用程序組成的系統。 Web應用程序具有Java Web Service,該Java Web Service具有返回Program類的實體對象的方法:

@WebMethod(operationName = "getProgram")
public Program getProgram(@WebParam(name = "macAddress") String macAddress){
    Device device = DeviceManager.getInstance().getDevice(macAddress);
    if(device != null){
        return device.getProgram();
    }
    return null;
}

此類型為Program的返回對象,具有許多屬性和關系:

@Entity
@Table(name = "PROGRAM", schema = "APP")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Program.getProgramsByWeather", query = "SELECT p FROM Program p WHERE p.weather = :weather")})
public class Program extends DbEntity implements Serializable {

    private static final long serialVersionUID = 1L;
    @JoinColumn(name = "LOGO_ID", referencedColumnName = "ID")
    @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch= FetchType.EAGER)
    private Logo logo;
    @JoinColumn(name = "WEATHER_ID", referencedColumnName = "ID")
    @ManyToOne
    private Weather weather;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "program", orphanRemoval = true)
    private List<ProgramPlaylist> programPlaylistList = new ArrayList<>();
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "program", orphanRemoval = true)
    private List<ProgramTicker> programTickerList = new ArrayList<>();
    @Column(name = "UPDATED")
    private boolean updated;

    public Program() {
    }

    public Program(String name, AppUser owner) {
        super(name, owner);
    }

    public Logo getLogo() {
        return logo;
    }

    public void setLogo(Logo logo) {
        this.logo = logo;
    }

    public Weather getWeather() {
        return weather;
    }

    public void setWeather(Weather weather) {
        this.weather = weather;
    }

    public boolean isUpdated() {
        return updated;
    }

    public void setUpdated(boolean updated) {
        this.updated = updated;
    }

    @XmlElement
    public List<ProgramPlaylist> getProgramPlaylistList() {
        return programPlaylistList;
    }

    @XmlElement
    public List<ProgramTicker> getProgramTickerList() {
        return programTickerList;
    }

    @Override
    public String toString() {
        return "Program[ id=" + getId() + " ]";
    }
}

客戶端可以獲取此對象並訪問客戶端應用程序中的某些屬性,例如program.name,它是從DbEntity繼承的,但是當我嘗試調用類似的內容時:

program.logo.name

客戶端拋出NullReferenceException。 當我嘗試遍歷programPlaylistList ArrayList的元素時,會發生相同的異常。

我假設傳遞給客戶端的對象本身未完全加載。

我該如何解決此問題,請幫忙?!

編輯好,所以我打印出客戶端從服務獲得的XML響應,並正確填充了該響應,但是由於某些原因,沒有填充對象字段,並且大多數情況下為null。 為什么會這樣呢?

默認情況下,@OneToMany批注的獲取策略為LAZY ,是否嘗試過像@oneToOne字段中那樣將其指定給EAGER(fetch = FetchType.EAGER)?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM