Двунаправленное отношение между @OneToMany и @ManyToOne @Formula возвращает ноль - PullRequest
0 голосов
/ 18 декабря 2018

По сути, у меня есть две сущности.

  • Резервирование
  • Комната

Сущность Reservation имеет отношение один ко многимс сущностью Room.Аналогично, сущность Room имеет отношение многие-к-одному с сущностью Reservation.Отношение от Reservation до Room всегда существует.Но отношение от Room до Reservation существует только в том случае, если статус резервирования помечен как "зарегистрирован" (для этого я использую порядковые номера перечисления. Порядковый номер ReservationStatus.CHECKED_IN равен 1.)

Аннотации @OneToMany было достаточно, чтобы показать отношение один ко многим.Для отношений «многие к одному» я использую аннотации @ManyToOne и @Formula.Я довольно новичок в Hibernate.Поэтому я создал формулу после тестирования на консоли MySQL.

Это запрос MySQL, который я выполнил, и получил результат.выберите * из резервирования r оставьте присоединиться к booking_rooms s на r.identifier = s.reservation_identifier слева присоединитесь к комнате m на s.rooms_identifier = m.identifier, где r.reservation_status = 1 и m.identifier = 4

m.identifier = 4 заменяется на m.identifier = identifier в классе Room.Приведенный выше запрос прекрасно работает в консоли MySQL.Но тогда он всегда возвращает null, когда я запускаю его в приложении.

Это источник Room class.

@Entity
public class Room {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer identifier;

    private Integer propertyIdentifier;

    private String number;

    @ManyToOne(cascade = CascadeType.ALL)
    private RoomType roomType;

    @ManyToOne(cascade = CascadeType.ALL)
    private Floor floor;

    @ManyToOne(cascade = CascadeType.ALL)
    private Block block;

    // select * from reservation r left join reservation_rooms s on r.identifier = s.reservation_identifier left join room m on s.rooms_identifier = m.identifier where r.reservation_status = 1 and m.identifier = 4
    @Formula(value = "select r from reservation r left join reservation_rooms s on r.identifier = s.reservation_identifier left join room m on s.rooms_identifier = m.identifier where m.identifier = identifier and r.reservation_status = 1")
    @ManyToOne(cascade = CascadeType.ALL)
    private Reservation occupantReservation;

    private Integer statusIdentifier;

    public Integer getIdentifier() {
        return identifier;
    }

    public void setIdentifier(Integer identifier) {
        this.identifier = identifier;
    }

    public Integer getPropertyIdentifier() {
        return propertyIdentifier;
    }

    public void setPropertyIdentifier(Integer propertyIdentifier) {
        this.propertyIdentifier = propertyIdentifier;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public Integer getStatusIdentifier() {
        return statusIdentifier;
    }

    public void setStatusIdentifier(Integer statusIdentifier) {
        this.statusIdentifier = statusIdentifier;
    }

    public RoomType getRoomType() {
        return roomType;
    }

    public void setRoomType(RoomType roomType) {
        this.roomType = roomType;
    }

    public Floor getFloor() {
        return floor;
    }

    public void setFloor(Floor floor) {
        this.floor = floor;
    }

    public Block getBlock() {
        return block;
    }

    public void setBlock(Block block) {
        this.block = block;
    }

    @Override
    public boolean equals(Object object) {
        boolean result = false;
        if (object == this) {
            result = true;
        }
        else if ((object instanceof Room)) {
            Room other = (Room) object;
            if (other.identifier.equals(identifier)) {
                result = true;
            }
        }
        return result;
    }

    @Override
    public int hashCode() {
        return identifier;
    }

    public Reservation getOccupantReservation() {
        return occupantReservation;
    }

    public void setOccupantReservation(Reservation occupantReservation) {
        this.occupantReservation = occupantReservation;
    }
}

Это источник Reservationкласс.

@Entity
public class Reservation {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer identifier;

    @ManyToOne(cascade = CascadeType.ALL)
    private Property property;

    @ManyToOne(cascade = CascadeType.ALL)
    private Guest guest;

    @Temporal(TemporalType.DATE)
    private Date arrival;

    @Temporal(TemporalType.DATE)
    private Date departure;

    private Integer nights;

    private Integer adults;

    private Integer children;

    @OneToMany(cascade = CascadeType.ALL)
    private Set<Room> rooms;

    @Enumerated(value = EnumType.ORDINAL)
    private ReservationSource source;

    private ReservationStatus reservationStatus;

    public Integer getIdentifier() {
        return identifier;
    }

    public void setIdentifier(Integer identifier) {
        this.identifier = identifier;
    }

    public Guest getGuest() {
        return guest;
    }

    public void setGuest(Guest guest) {
        this.guest = guest;
    }

    public Date getArrival() {
        return arrival;
    }

    public void setArrival(Date arrival) {
        this.arrival = arrival;
    }

    public Date getDeparture() {
        return departure;
    }

    public void setDeparture(Date departure) {
        this.departure = departure;
    }

    public Integer getNights() {
        return nights;
    }

    public void setNights(Integer nights) {
        this.nights = nights;
    }

    public Integer getAdults() {
        return adults;
    }

    public void setAdults(Integer adults) {
        this.adults = adults;
    }

    public Integer getChildren() {
        return children;
    }

    public void setChildren(Integer children) {
        this.children = children;
    }

    public Property getProperty() {
        return property;
    }

    public void setProperty(Property property) {
        this.property = property;
    }

    public ReservationStatus getReservationStatus() {
        return reservationStatus;
    }

    public void setReservationStatus(ReservationStatus reservationStatus) {
        this.reservationStatus = reservationStatus;
    }

    public void setRooms(Set<Room> rooms) {
        this.rooms = rooms;
    }

    public Set<Room> getRooms() {
        return rooms;
    }

    public ReservationSource getSource() {
        return source;
    }

    public void setSource(ReservationSource source) {
        this.source = source;
    }
}

Это журнал с консоли MySQL.

mysql> describe room;
+---------------------------------+--------------+------+-----+---------+-------+
| Field                           | Type         | Null | Key | Default | Extra |
+---------------------------------+--------------+------+-----+---------+-------+
| identifier                      | int(11)      | NO   | PRI | NULL    |       |
| number                          | varchar(255) | YES  |     | NULL    |       |
| property_identifier             | int(11)      | YES  |     | NULL    |       |
| status_identifier               | int(11)      | YES  |     | NULL    |       |
| block_identifier                | int(11)      | YES  | MUL | NULL    |       |
| floor_identifier                | int(11)      | YES  | MUL | NULL    |       |
| occupant_reservation_identifier | int(11)      | YES  | MUL | NULL    |       |
| room_type_identifier            | int(11)      | YES  | MUL | NULL    |       |
+---------------------------------+--------------+------+-----+---------+-------+
8 rows in set (0.03 sec)

mysql> describe reservation_rooms;
+------------------------+---------+------+-----+---------+-------+
| Field                  | Type    | Null | Key | Default | Extra |
+------------------------+---------+------+-----+---------+-------+
| reservation_identifier | int(11) | NO   | PRI | NULL    |       |
| rooms_identifier       | int(11) | NO   | PRI | NULL    |       |
+------------------------+---------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql> describe reservation;
+---------------------+---------+------+-----+---------+-------+
| Field               | Type    | Null | Key | Default | Extra |
+---------------------+---------+------+-----+---------+-------+
| identifier          | int(11) | NO   | PRI | NULL    |       |
| adults              | int(11) | YES  |     | NULL    |       |
| arrival             | date    | YES  |     | NULL    |       |
| children            | int(11) | YES  |     | NULL    |       |
| departure           | date    | YES  |     | NULL    |       |
| nights              | int(11) | YES  |     | NULL    |       |
| reservation_status  | int(11) | YES  |     | NULL    |       |
| source              | int(11) | YES  |     | NULL    |       |
| guest_identifier    | int(11) | YES  | MUL | NULL    |       |
| property_identifier | int(11) | YES  | MUL | NULL    |       |
+---------------------+---------+------+-----+---------+-------+
10 rows in set (0.02 sec)

mysql> select * from reservation_rooms;
+------------------------+------------------+
| reservation_identifier | rooms_identifier |
+------------------------+------------------+
|                      6 |                4 |
+------------------------+------------------+
1 row in set (0.00 sec)

mysql> select * from reservation;
+------------+--------+------------+----------+------------+--------+--------------------+--------+------------------+---------------------+
| identifier | adults | arrival    | children | departure  | nights | reservation_status | source | guest_identifier | property_identifier |
+------------+--------+------------+----------+------------+--------+--------------------+--------+------------------+---------------------+
|          6 |      2 | 2018-12-27 |        2 | 2018-12-27 |      2 |                  1 |   NULL |                5 |                NULL |
+------------+--------+------------+----------+------------+--------+--------------------+--------+------------------+---------------------+
1 row in set (0.02 sec)

mysql> select * from rooms;
ERROR 1146 (42S02): Table 'onecube_pms.rooms' doesn't exist
mysql> select * from room;
+------------+--------+---------------------+-------------------+------------------+------------------+---------------------------------+----------------------+
| identifier | number | property_identifier | status_identifier | block_identifier | floor_identifier | occupant_reservation_identifier | room_type_identifier |
+------------+--------+---------------------+-------------------+------------------+------------------+---------------------------------+----------------------+
|          4 | 190    |                   1 |                 2 |                1 |                2 |                            NULL |                    3 |
+------------+--------+---------------------+-------------------+------------------+------------------+---------------------------------+----------------------+
1 row in set (0.00 sec)

Можете ли вы указать мне, что я делаю неправильно?Спасибо за ваше время.

1 Ответ

0 голосов
/ 18 декабря 2018

Я думаю, что использование фильтров было бы более подходящим в вашей ситуации:

1) Определите фильтр на Reservation:

@Entity
@FilterDef(name="reservationFilter", defaultCondition="reservation_status = 1")
@Entity
public class Reservation {

2) и затем на @ManyToOne:

@ManyToOne(cascade = CascadeType.ALL)
@Filter(name = "reservationFilter")
private Reservation occupantReservation;

3) Включить до запроса:

Session session = sessionFactory.getCurrentSession();
session.enableFilter("reservationFilter");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...