Я создаю 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;
}