У меня есть следующая работа без 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, но безрезультатно.