我正在使用该对象,该对象有超过15个相关实体(父母)。在我的UI方面,我只需要这些实体的ID,所以我不需要Hibernate的 fetch 功能,我使用 lazy proxy 概念来避免命中数据库另一方面,让另一方面拥有填充ids的对象。
为了实现这一点,我必须使用属性访问而不是所有父实体的字段访问:
@Id
@Access(AccessType.PROPERTY) // this helps to avoid database hit on get, but not on set!!!
private Long id;
到目前为止,我从数据库中加载了对象(没有进行额外的连接),并在Web UI上显示所有关系(最多只是简单的选择输入)。我没有为UI创建克隆(值对象),我直接使用分离的hibernate对象。但是,当我对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字段......
提前致谢!