2013-04-25 4 views
0

Итак, я сейчас работаю над системой, состоящей из Java Web-приложения и клиентского приложения C#. Веб-приложение имеет Java Web Service, который имеет метод, который возвращает сущности объект программы класса:Удаленный доступ к объекту Jpa

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

Это возвращение объект типа программы, которая имеет множество свойств и отношений:

@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() + " ]"; 
    } 
} 

Client может получить этот объект и получить доступ к некоторым свойствам в клиентском приложении, например program.name, которое он наследует от DbEntity, но когда я пытаюсь позвонить примерно так:

program.logo.name 

клиент бросает NullReferenceException. Такое же исключение возникает, когда я пытаюсь выполнить итерацию по элементам programPlaylistList ArrayList.

Я предполагаю, что сам объект, который передается клиенту, не полностью загружен.

Как я могу решить эту проблему, пожалуйста, помогите ?!

EDIT Ok, поэтому я распечатал ответ XML, что клиент получить от службы и ее заселена правильно, но по какой-то причине поля объекта не заполняются и в основном нуль. Почему это происходит?

+0

Кто-нибудь? Я действительно застрял здесь ... –

ответ

0

По умолчанию, стратегия выборки для @OneToMany аннотаций LAZY, вы пробовали указать ее EAGER, как в поле @oneToOne (fetch = FetchType.EAGER)?

+0

Да, у меня есть. На самом деле, что @OneToOne fetchType остался от меня, пытаясь проверить, работает ли он, но, к сожалению, это не так. Даже для этого поля, где я указал fetchType = EAGER, я все еще не могу читать свойства из логотипа. –