У меня ошибка при использовании Hibernate с SparkJava в режиме отложенной загрузки.
Он работает правильно без SparkJava, но при использовании SparkJava пытается принудительно загрузить загрузку для отношения OneToMany.
- Модель
@Entity
@Table(name = "KU_SUPPLIER")
public class Supplier {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@NotEmpty(message = "Please provide a name")
private String name;
@OneToMany(mappedBy = "supplier")
private List<Item> items; // Should be lazy-loaded
// Constructor / Getters / Setters
}
- DAO
public class SupplierDao implements Dao<Supplier> {
private final SessionFactory sessionFactory;
public SupplierDao(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Override
@SuppressWarnings("unchecked")
public List<Supplier> findAll() {
try (Session session = sessionFactory.openSession()) {
return session.createQuery("FROM com.seafrigousa.model.Supplier").getResultList();
}
}
}
- Основной
// Working perfectly and lazy-load Items as desired
supplierDao.findAll();
// The method will be called when a web browser goes to "localhost/suppliers"
// It throws org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: model.Supplier.items, could not initialize proxy - no Session
get("/suppliers", "application/json", supplierDao::findAll);
Я проверил, не закрывая сеанс из DAO, и увидел, что Hibernate выполнял запрос, как если бы он находился в режиме загрузки EAGER, поэтому он выполнял два выбора, один для поставщика и один для элемента.
Есть ли причина для такого поведения?
Спасибо!