我有一个名为InventoryLineItem的域类,它具有InventoryAccess类型的属性:

class InventoryLineItem {

    InventoryAccess inventoryAccess
    ...
}

还有一个称为LineItem的域类,它具有InventoryLineItem类型的属性:
class LineItem {

    InventoryLineItem inventoryLineItem
    ...
}

我面临的问题是,当我尝试从LineItem类(例如inventoryLineItem.inventoryAccess?.allotment)访问InventoryAccess的任何属性时,出现以下异常:
java.lang.IllegalStateException: Proxy for [com.acme.inventory.domain.InventoryAccess:8604205056156879654] could not be initialized
我正在将实例添加到LineItem实例,如下所示:
List<LineItem> lineItemsPendingTransfer = originalDeliveredItemIds.collect { Long id ->
    InventoryLineItem.get(id)?.lineItem
}

然后,我遍历每个订单项,并为每个订单项在LineItem中调用一个执行此操作的方法:
if (inventoryLineItem.inventoryAccess?.allotment?.scannableEndDate?.before(new Date())) {
    return LineItemTransferState.buildUnavailableState(UnavailableTransferReason.OUTDATED)
}

这就是问题所在。一旦我尝试从 list 访问对象获取allotment属性,就会引发异常。

我尝试将InventoryLineItem中的ventoryAccess属性设置为lazy: false,但这没有帮助。

最佳答案

如果应该将 InventoryAccess 保留在数据库中,则它也必须是域类。

如果不是,则可以将其设置为transient,但是您必须自己设置值。例如,您可以添加一个 setter/getter 来延迟初始化该属性:

class InventoryLineItem {
    InventoryAccess inventoryAccess

    static transients = ['inventoryAccess']

    InventoryAccess getInventoryAccess() {
        if(inventoryAccess == null) {
            // do something to initialize inventoryAcces
        }

        return inventoryAccess
    }
}

关于hibernate - Grails-java.lang.IllegalStateException:无法初始化代理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31859181/

10-14 03:50