使用Jackson数据类型Hibernate进行JPA + Hibernate OGM +延迟初始化

时间:2017-07-20 08:44:10

标签: java jpa jackson lazy-initialization hibernate-ogm

我想选择何时加载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对象。不知道你何时在代理对象上“工作”   而不是实体对象可能导致奇怪的结果或异常

如何实施代理?

1 个答案:

答案 0 :(得分:1)

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

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