GORM Grails中的延迟加载

时间:2014-08-23 12:09:52

标签: java hibernate grails groovy gorm

我正试图在Java Clasgroovy domain class的{​​{1}}关系中延迟加载,当我使用lazy: false时,它可以正常工作,但是当我标记lazy:true时,它就没有得到表数据。 我使用下面的代码: -

域类: -

产品类别: -

class Products {

    static mapping = {
        version  false
        id name: 'productId', generator:'assigned'
        }

    String productId
    String reference 
    String code  
    String codetype 
}

股票类别: -

class Stock {

    static mapping = {
        version  false
        id name: 'stockId', generator:'assigned'
        product column:"product",lazy:true
        }

    String stockId

    Products product


    static belongsTo = [product: Products] 
}

服务类: -

@Transactional
class StockService {
    public List<Stock> getStockList() {


            def stock = Stock.list()
             return stock

        }
}

获取股票数据和产品数据的Java类: -

   StockService stockService = Grails.get(StocktService.class);
   List<Stock> stock = stockService.getStockList();
   Products product = stock.get(0).getProduct();

但产品对象显示null。它应该是产品数据。上面的代码有什么问题吗?

1 个答案:

答案 0 :(得分:1)

Hibernate使用代理对象来启用延迟加载。代理对象是我们的域/模型类的运行时创建子类的对象,即本例中的Products和Stock。

现在,在调用stock.getProduct()时,它将从子类调用该方法。在这里,它将首先查询数据库,然后从我们的方法调用代码。

延迟加载工作的重点是hibernate会话应该打开。

Grails服务方法默认是事务性的,并且有会话但是当涉及到java类时,似乎没有会话。

尝试在java类中打开一个会话,同时调用你的grails服务方法。在关闭会话之前,尝试从库存中获取产品对象。