Я нашел похожие вопросы, но они не ответили на мой вопрос.
У меня есть две сущности с отношением многие-к-одному - однонаправленные.
Но самое главное, отношения ленивые. Поскольку использовать ленивое соединение правильно, это знают все.
Код:
@Entity
public class User implements BaseEntity {
@Id
@Column
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String name;
@ManyToOne(fetch = FetchType.LAZY)
private City city;
}
@Entity
public class City implements BaseEntity {
@Id
@Column
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String name;
}
interface BaseEntity {
void setId(Long id);
Long getId();
}
Я написал метод, который позволяет осуществлять поиск по переданным полям сущности.
Пример того, как это работает:
public class Search<T extends BaseEntity> {
public List<T> getByFields(T entity, List<FieldHolder> data) {
// create criteria with passed field name and value by reflection
}
}
class FieldHolder {
private String fieldName;
private Object value;
/**
* "true" - means that the field "value" contains id related object
* "false" - elementary type like: String, Wrapper, Primitive
*/
private boolean isRelationId;
}
Проблема в том, что проблемы начинаются, когда вам нужно искать и связанные объекты - с помощью создания связанных запросов.
Следующая запись используется для отправки связанного поля: "city.id", и проблема в том, что, когда я передаю сущность связанного объекта (City), он находится в прокси, и я не могу получить идентификатор по отражению от City .
Моя функция работает отлично, если вы укажете:
@ManyToOne(fetch = FetchType.EAGER)
private City city;
Но это сильно повлияет на производительность, так как у меня много связанных объектов. Поэтому я хочу решить эту проблему для ленивой загрузки.
Я знаю, что это не простая задача. Но, возможно, есть какая-то возможность как-то обойти эту проблему.