2017-07-20 56 views
1

我想选择时加载设置与懒惰JPA + Hibernate的OGM +延迟初始化与杰克逊的数据类型的Hibernate

这是我的实体产品

@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(); 
    } 
} 

This i我的产品服务

@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 OGM)支持懒加载使用代理对象,而不是初始化类 实体类的实例。 Hibernate使用代理作为解决方案,将从数据库接收到的互连数据“分解”为可轻松存储在内存中的小块。了解Hibernate动态生成 代理的延迟加载对象可能会很有用。机会是,你不知道代理对象,并且直到你得到 类型LazyInitializationException的一些异常,或者直到你试图在调试器中测试延迟加载并且注意到一些非空对象的存在null属性。不知道,当你代理对象 而不是一个实体对象的“工作”可能会导致奇怪的结果或异常

我怎样才能实现代理?

回答

1

您不必实现代理,Hibernate OGM将根据需要实例化一个代理。

在这种情况下,对于每个结果p.getCategories()返回的值应该是代理。

+0

事实上,但当我尝试访问我得到它的_Caused:org.hibernate作为.LazyInitializationException:未能延迟初始化角色集合__ – Pako

+0

您应该检查是否发生在正在运行的事务中。即使在MongoDB中,Hibernate OGM仍然需要事务划分。 – Davide

0

第二断言失败

@Test 
public void testLazyHibernate(){ 
    List<Product> products = productService.findAll(); 
    for (Product p: 
      products) { 
     assertFalse(Hibernate.isInitialized(p.getCategories())); 
     Set<Category> categories = p.getCategories(); 
     assertTrue(Hibernate.isInitialized(categories)); 
    } 
} 

我会用杰克逊的数据类型,休眠,但不起作用

@Provider 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public class MyJacksonJsonProvider implements ContextResolver<ObjectMapper> { 

    private static final ObjectMapper MAPPER = new ObjectMapper(); 
    private Hibernate5Module hbm5; 

    static { 
     MAPPER.enable(SerializationFeature.INDENT_OUTPUT); 
     MAPPER.registerModule(new SimpleModule().addSerializer(Product.class, new ProductSerializer())); 
     MAPPER.registerModule(new Hibernate5Module().enable(Hibernate5Module.Feature.FORCE_LAZY_LOADING)); 

      } 

    public MyJacksonJsonProvider() { 
     hbm5 = new Hibernate5Module(); 
    hbm5.configure(Hibernate5Module.Feature.FORCE_LAZY_LOADING,true); 
     hbm5.enable(Hibernate5Module.Feature.FORCE_LAZY_LOADING); 

     System.out.println("Instantiate MyJacksonJsonProvider"); 
    } 

    @Override 
    public ObjectMapper getContext(Class<?> type) { 
     System.out.println("MyJacksonProvider.getContext() called with type: "+type); 
     return MAPPER; 
    } 
}