@OneToOne или @manytoon на упаковке.Идентификатор BookingEntity.roomId ссылается на неизвестный объект: длинный

#hibernate #jpa #spring-data-jpa

Вопрос:

Я пытаюсь создать единую связь между двумя сущностями, но я получаю эту ошибку:

@OneToOne или @manytoon в бэкендсервисе.сущность.Идентификатор BookingEntity.roomId ссылается на неизвестную сущность: долго

Мои сущности

 @Data
@Entity(name = "bookings")
public class BookingEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "id")
  private Long id;

  @OneToOne(cascade = CascadeType.ALL)
  @JoinColumn(name = "fk_roomId", referencedColumnName = "id")
  private Long roomId;

  @Column(name = "booked_by")
  private String bookedBy;

  @Column(name = "date_booked")
  private String dateBooked;
}
 

 @Data
@Entity(name = "rooms")
public class RoomEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "id")
  private Long id;

  @Column(name = "room_name")
  private String roomName;

  @OneToOne(mappedBy = "fk_roomId")
  private BookingEntity bookingEntity;
}
 

Ответ №1:

В поле связи вы должны использовать фактическую сущность, а не только Длинное поле. Итак, этот код:

 @OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "fk_roomId", referencedColumnName = "id")
private Long roomId;
 

следует изменить на что-то вроде

 @OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "fk_roomId", referencedColumnName = "id")
private RoomEntity room;
 

Кроме того, я хотел бы отметить, что из соображений производительности настоятельно рекомендуется объявлять ваши ассоциации ленивыми:

 @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
 

Комментарии:

1. Спасибо. Единственная проблема в том,что это портит мои модульные тесты. например, набор, получить roomId больше не работает!!

2. Тогда что-то не так с модульным тестом. Я предлагаю создать правильный вопрос здесь на SO.