【问题标题】:Lazy Loading In GORM GrailsGORM Grails 中的延迟加载
【发布时间】:2014-08-23 12:09:52
【问题描述】:

我试图在groovy domain class 中的关系Java Class 中延迟加载,当我使用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

        }
}

获取 Stock 数据和 Product Data 的 Java 类:-

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

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

【问题讨论】:

    标签: java hibernate grails groovy grails-orm


    【解决方案1】:

    Hibernate 使用代理对象来启用延迟加载。代理对象是我们的领域/模型类的运行时创建的子类的对象,即在这种情况下为 Products 和 Stock。

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

    延迟加载工作的重要一点是应该打开休眠会话。

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

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

    【讨论】:

    • 如何在Java类中打开Grailshibernate会话?
    猜你喜欢
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 2011-03-14
    • 1970-01-01
    相关资源
    最近更新 更多