【发布时间】:2019-03-29 23:29:34
【问题描述】:
我在延迟加载模式下使用 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 加载模式一样,因此它正在执行两个选择,一个用于供应商,一个用于项目。
这种行为有原因吗?
谢谢!
【问题讨论】:
标签: java hibernate lazy-initialization spark-java