2

我正在使用该对象,它有超过 15 个相关实体(父母)。在我的 UI 方面,我只需要这些实体的 id,所以我不需要 Hibernate 的fetch功能,我使用惰性代理概念一方面避免对数据库的命中,另一方面让对象具有填充的 id .

为了实现这一点,我必须对所有父实体使用属性访问而不是字段访问:

@Id
@Access(AccessType.PROPERTY) // this helps to avoid database hit on get, but not on set!!!    
private Long id;

到目前为止一切顺利,我从数据库加载对象(没有进行额外的连接)并在 Web UI 上显示所有关系(最多简单的选择输入)。我不为 UI 创建克隆(值对象),我直接使用分离的休眠对象。但是当我对 UI 进行任何更改(更改父对象)时,框架会为相关的代理实体调用setId()并且 .... 这会导致这些代理的初始化!这是来自 Hibernate BasicLazyInitializer 的代码:

else if ( method.equals(setIdentifierMethod) ) {
        initialize(); // Here the db hit occurs!!
        setIdentifier( (Serializable) args[0] );
        return INVOKE_IMPLEMENTATION;
     }

并且发生 LazyInitializationException(当然,我此时没有会话!)。

那么,是否有任何方法可以在不为所有实体创建值对象的情况下从数据库中获取?我可以说,我总是直接在 UI 中使用数据对象,但它们都被完全获取(不是代理),而且我没有像现在使用这些代理这样的问题......

我真的不明白,为什么 Hibernate 在设置时进行代理初始化(尽管在获取时没有这样做)@ID 字段......

提前致谢!

4

0 回答 0