Возвращение объекта с отношением в веб-сервисах Java JAX-WS с Hibernate - PullRequest
0 голосов
/ 21 апреля 2019

Я создаю SOAP Web Service с использованием Java, JAX-WS и Hibernate.У меня есть 2 таблицы: Flight и Ticket, автоматически сгенерированные классы и отображения (Flight.hbm.xml и Ticket.hbm.xml).Существует проблема, когда я хочу вернуть объект с отношением, например, объект полета с соответствующими билетами.Когда я делаю это, XML-ответ недопустим и выглядит так:

Неверный ответ при возврате

Когда я устанавливаю тикеты в пустой набор, тогда он работает и возвращает Flightобъект без связанных билетов.

Ответ, если нет связанных билетов

Проблема связана с каждым отношением, поэтому билет с соответствующим рейсом тоже не работает.В консоли нет ошибок.Hibernate настроен правильно, потому что HQL-запрос возвращает действительные данные.

Как вернуть объект со связанными объектами?Почему это не работает?Есть какие-нибудь подсказки?

Flight.java

package models;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

public class Flight  implements java.io.Serializable {
     private Integer id;
     private String from;
     private String to;
     private Date date;
     private Date time;
     private Integer duration;
     private Set<Ticket> tickets = new HashSet<Ticket>(0);

    public Flight() {
    }


    public Flight(String from, String to, Date date, Date time) {
        this.from = from;
        this.to = to;
        this.date = date;
        this.time = time;
    }
    public Flight(String from, String to, Date date, Date time, Integer duration, Set<Ticket> tickets) {
       this.from = from;
       this.to = to;
       this.date = date;
       this.time = time;
       this.duration = duration;
       this.tickets = tickets;
    }

    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
    public String getFrom() {
        return this.from;
    }

    public void setFrom(String from) {
        this.from = from;
    }
    public String getTo() {
        return this.to;
    }

    public void setTo(String to) {
        this.to = to;
    }
    public Date getDate() {
        return this.date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
    public Date getTime() {
        return this.time;
    }

    public void setTime(Date time) {
        this.time = time;
    }
    public Integer getDuration() {
        return this.duration;
    }

    public void setDuration(Integer duration) {
        this.duration = duration;
    }
    public Set<Ticket> getTickets() {
        return this.tickets;
    }

    public void setTickets(Set<Ticket> tickets) {
        this.tickets = tickets;
    }
}

Ticket.java

package models;

public class Ticket  implements java.io.Serializable {


     private Integer id;
     private Flight flight;
     private long price;

    public Ticket() {
    }

    public Ticket(Flight flight, long price) {
       this.flight = flight;
       this.price = price;
    }

    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
    public Flight getFlight() {
        return this.flight;
    }

    public void setFlight(Flight flight) {
        this.flight = flight;
    }
    public long getPrice() {
        return this.price;
    }

    public void setPrice(long price) {
        this.price = price;
    }
}

Рейс.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Apr 14, 2019 2:24:06 PM by Hibernate Tools 4.3.1 -->
<hibernate-mapping>
    <class name="models.Flight" table="flight" catalog="soap_server" optimistic-lock="version">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name="from" type="string">
            <column name="from" length="64" not-null="true" />
        </property>
        <property name="to" type="string">
            <column name="to" length="64" not-null="true" />
        </property>
        <property name="date" type="date">
            <column name="date" length="10" not-null="true" />
        </property>
        <property name="time" type="time">
            <column name="time" length="8" not-null="true" />
        </property>
        <property name="duration" type="java.lang.Integer">
            <column name="duration" />
        </property>
        <set name="tickets" table="ticket" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="flight_id" not-null="true" />
            </key>
            <one-to-many class="models.Ticket" />
        </set>
    </class>
</hibernate-mapping>

Ticket.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Apr 14, 2019 2:24:06 PM by Hibernate Tools 4.3.1 -->
<hibernate-mapping>
    <class name="models.Ticket" table="ticket" catalog="soap_server" optimistic-lock="version">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <many-to-one name="flight" class="models.Flight" fetch="select">
            <column name="flight_id" not-null="true" />
        </many-to-one>
        <property name="price" type="long">
            <column name="price" precision="10" scale="0" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

Метод веб-службы выглядит следующим образом:

FlightService.java

...
  @WebMethod
    public Flight getFlight(int id) {
        Flight flight = this.flightRepository.getFlight(id);
        return flight;
    }
...

FlightRepository.java

public Flight getFlight(int id) {
        Flight flight = null;
        try {
            Query q = session.createQuery ("SELECT f FROM Flight f WHERE id = :id ")
                .setParameter("id", id);
            List<?> list = q.list();
            flight = (Flight) list.get(0);
            if (!this.tx.wasCommitted()) {
                tx.commit();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println(flight.getTickets());

        return flight;
    }
...