У меня есть два класса InvitedPerson
и Flight
с взаимной привязкой друг к другу. Вот как они аннотируются.Дополнительные запросы в JPA
public class InvitedTech{
...
@OneToOne(mappedBy="invitedTech", cascade = CascadeType.ALL, fetch=FetchType.LAZY)
public Flight flight;
@OneToOne(mappedBy="invitedTech", cascade = CascadeType.ALL, fetch=FetchType.LAZY)
public Hotel hotel;
...
}
public class Flight{
...
@OneToOne
@JoinColumn(name="invitedTechId", nullable=false)
public InvitedTech invitedTech;
...
}
Как вы можете видеть Flight
является владельцем отношений и InvitedTech
другая сторона этого двунаправленного отношения. InvitedTech также имеет отношение OneToOne
с Hotel
Теперь, когда я пишу простой запрос для получения всех рейсов, он вызывает три запроса в целом. 1-й, который дает мне результаты, но вызывает 2 дополнительных запроса.
List<Flight> flg = JPA.em().createQuery("SELECT flg from Flight flg").getResultList();
- запрос, который получает все рейсы (Это только один, что мне нужно)
- Запрос с объединением между InvitedTech и Flight
- Запрос с объединением между invitedTech и отель
Почему выполняется запрос 2 & 3, хотя я установил FetchType = Lazy. Я не имею доступа к информации о гостинице. И Flight не должны быть запросами снова, так как первый запрос возвращает данные.
После некоторых игр, когда я удаляю атрибут mappedBy
из обоих аннотаций, эти 2 сложения не выполняются (то есть только 1-й выполняется).
Почему атрибут mappedBy
вызывает выполнение дополнительных запросов, хотя FetchType=Lazy
. Есть ли способ остановить это?
Доступ к полям по-прежнему работает без атрибутов 'mappedBy'? – chrylis
Если вы имеете в виду доступ к полям InvitedTech («Отель и рейс»), они будут иметь нулевое значение без сопоставления, поскольку JPA не знает об этом обратном отношении. – SpartanElite