gpt4 book ai didi

java - @OneToMany 和@ManyToOne 之间的双向关系 @Formula 返回 null

转载 作者:行者123 更新时间:2023-11-29 03:17:01 26 4
gpt4 key购买 nike

基本上,我有两个实体。

  • 预订
  • 房间

Reservation 实体与 Room 实体具有一对多关系。同样,Room 实体与 Reservation 实体具有多对一关系。从 ReservationRoom 的关系始终存在。但是从 RoomReservation 的关系只有在预订状态被标记为“checked in”时才存在(我为此使用枚举序数。 的序数ReservationStatus.CHECKED_IN1。)

@OneToMany 注释已经足以显示一对多关系。对于多对一关系,我使用了 @ManyToOne@Formula 注释。我是 Hibernate 的新手。所以我在 MySQL 控制台上测试后制作了公式。

这是我运行的 MySQL 查询,我得到了结果。 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 其中r.reservation_status = 1 and m.identifier = 4

Room 类中,m.identifier = 4 被替换为 m.identifier = identifier。上面的查询在 MySQL 控制台中运行良好。但是当我在应用程序中运行它时,它总是返回 null

这是 Room 类的源代码。

@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)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");

关于java - @OneToMany 和@ManyToOne 之间的双向关系 @Formula 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53825885/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com