Ленивая загрузка с EJB + JPA + Джерси - PullRequest
0 голосов
/ 23 октября 2018

У меня есть следующая работа без FetchType.LAZY:

@Entity
public class Test {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String text;

    @ManyToOne  
    @JoinColumn(name = "lazy_id")
    private Lazy lazy;

    //getters and setters
}

@Entity
public class Lazy {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String text;

    //getters and setters
}

И метод запроса:

public List<Test> all() {
    try {
        return em.createQuery("FROM Test t").getResultList();
    } catch (NoResultException e) {
        return null;
    }
}

Это результат JSON:

[{"id":1,"text":"test 1","lazy":{"id":1,"text":"lazy 1"}},
{"id":2,"text":"test 2","lazy":{"id":2,"text":"lazy 2"}}]

Однако я хочу вернуть только идентификатор и текстовые данные, поэтому я попытался изменить @ManyToOne(fetch = FetchType.LAZY)

Затем я получаю следующие ошибки:

Severe:   Generating incomplete JSON
Severe:   org.hibernate.LazyInitializationException: could not initialize proxy [model.Lazy#1] - no Session

Я мог бы сделать что-то вроде изменениязапросить выборку только тех полей, которые я хочу:

public List<Test> all() {
    try {
        return em.createQuery("SELECT t.id, t.text FROM Test t").getResultList();
    } catch (NoResultException e) {
        return null;
    }
}

Но тогда мой ответ в интерфейсе JavaScript будет таким:

[[1,"test 1"],[2,"test 2"]]

Больше не массив объектов, отображающий все, дающее суммуобъектов, которые у меня есть, далек от идеала.

Большая часть содержимого, которое я нашел, - это как извлекать данные впоследствии, и это не мое дело, все, что мне нужно, это отправлять только те поля, которые я хочу в первую очередь.Я не уверен, следует ли использовать EJB @TransactionAttribute или нет, я не смог найти работающий пример.Я также пытался изменить стратегию на @OneToMany в классе Lazy, но безрезультатно.

1 Ответ

0 голосов
/ 10 декабря 2018

Поскольку ваш вопрос немного уходит в прошлое, я надеюсь, что он по-прежнему актуален для вас:

Если вы объявите отображение как ленивое (или так будет по умолчанию), JPA не получит егопока он не доступен.Таким образом, ваш класс Lazy будет доступен только в том случае, если JSON попытается преобразовать все это, и в этот момент у вас больше не будет открытого сеанса, поэтому данные не могут быть извлечены и приведут к org.hibernate.LazyInitializationException.

Если вы придерживаетесь ленивого сопоставления (которое обычно в основном хорошо), вы должны явно получить или получить к нему доступ, если вам нужны данные для варианта использования.

Проверьте Отличное объяснение Влада по теме.

...