我想选择何时加载Set with Lazy
这是我的实体产品
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Type(type = "objectid")
private String id;
private String name;
@ManyToMany(fetch = FetchType.LAZY)
private Set<Category> categories;
这是我的AbstractService
public abstract class AbstractService<T> {
private Class<T> entityClass;
public AbstractService(Class<T> entityClass){
this.entityClass=entityClass;
public List<T> findAll(){
Query nativeQuery = getEntityManager().createNativeQuery("{}", entityClass);
return getEntityManager().createNativeQuery("{}",entityClass).getResultList();
}
}
这是我的ProductService
@Stateless
public class ProductService extends AbstractService<Product> {
@PersistenceContext(unitName = "name-db")
private EntityManager em;
public ProductService() {
super(Product.class);
}
@Override
protected EntityManager getEntityManager() {
return em;
}
这是我的测试方法
@Test
public void testFindAllProducts()throws Exception {
List<Product> products = productService.findAll();
for (Product p:
products ) {
//Hibernate.initialize(p.getCategories());
System.out.println(p.toString());
}
}
我想在每次需要时使用代理来初始化类别
Hibernate(包括Hibernate OGM)支持使用代理对象而不是 实体类的实例。 Hibernate使用代理作为“分解”从数据库接收的互连数据的解决方案 较小的碎片,可以很容易地存储在内存中。了解Hibernate动态生成可能很有用 延迟加载的对象的代理。有可能,你不了解代理对象,直到你得到它 一些LazyInitializationException类型的异常,或者在尝试在调试器中测试延迟加载并注意之前 存在一些具有null属性的非null对象。不知道你何时在代理对象上“工作” 而不是实体对象可能导致奇怪的结果或异常
如何实施代理?
答案 0 :(得分:1)
您不必实现代理,Hibernate OGM会根据需要实例化。
在这种情况下,对于每个结果,p.getCategories()返回的值应该是代理。