我正试图在Java Clas
中groovy 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
。它应该是产品数据。上面的代码有什么问题吗?
答案 0 :(得分:1)
Hibernate使用代理对象来启用延迟加载。代理对象是我们的域/模型类的运行时创建子类的对象,即本例中的Products和Stock。
现在,在调用stock.getProduct()时,它将从子类调用该方法。在这里,它将首先查询数据库,然后从我们的方法调用代码。
延迟加载工作的重点是hibernate会话应该打开。
Grails服务方法默认是事务性的,并且有会话但是当涉及到java类时,似乎没有会话。
尝试在java类中打开一个会话,同时调用你的grails服务方法。在关闭会话之前,尝试从库存中获取产品对象。