Как получить значение ленивого поля Hibernate через отражение - PullRequest
0 голосов
/ 05 марта 2019

Я нашел похожие вопросы, но они не ответили на мой вопрос.

У меня есть две сущности с отношением многие-к-одному - однонаправленные. Но самое главное, отношения ленивые. Поскольку использовать ленивое соединение правильно, это знают все.

Код:

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

Но это сильно повлияет на производительность, так как у меня много связанных объектов. Поэтому я хочу решить эту проблему для ленивой загрузки.

Я знаю, что это не простая задача. Но, возможно, есть какая-то возможность как-то обойти эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...