У меня есть объект, который объединяет множество данных из разных таблиц.Связи являются OneToOne и все необязательны - только одно поле не является обязательным (и является ManyToOne).
OneToOne с lazy проблематично, поэтому я настроил средство улучшения байт-кода гибернации во время сборки.Вот сущности:
@Entity
public class LinkEntity {
@OneToOne(fetch = FetchType.LAZY, mappedBy = "link", cascade = CascadeType.PERSIST)
@LazyToOne(LazyToOneOption.NO_PROXY)
private FirstOptionalEntity first;
@OneToOne(fetch = FetchType.LAZY, mappedBy = "link", cascade = CascadeType.PERSIST)
@LazyToOne(LazyToOneOption.NO_PROXY)
private SecondOptionalEntity second;
@OneToOne(fetch = FetchType.LAZY, mappedBy = "link", cascade = CascadeType.PERSIST)
@LazyToOne(LazyToOneOption.NO_PROXY)
private ThirdOptionalEntity third;
@ManyToOne(fetch = FetchType.EAGER, optional = false, cascade = CascadeType.PERSIST)
@JoinColumn(name = "NEEDED_ID")
private NeededEntity needed;
}
@Entity
public class FirstOptionalEntity { // Second and Third looks the same
@OneToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "LINK_ID")
private LinkEntity link;
}
Теперь у меня есть следующая проблема: я хочу загрузить все LinkEntity и затем вызвать FirstEntity only .Но всякий раз, когда я вызываю какой-либо получатель ассоциаций OneToOne, каждое отношение OneToOne загружается сразу.
Это нормально или я что-то не так?
findAll(LinkEntity)
Строки журнала SQL о LinkEntity и NeededEntity -> хорошая
linkElement.getFirst()
строка журнала SQL от первого -> хорошая
строка журнала SQL от второго -> не очень хорошая
строка журнала SQL от третьего -> не такnice
В этом случае это проблематично, потому что я хочу загрузить много LinkEntities с одним OptionalEntity, соединенным слева, чтобы уменьшить количество запросов к базе данных.
Но теперь у меня есть оператор выбора ссылки, а после этого 3 * n операторов для необязательных объектов.