如何在没有 LazyInitializationException 的情况下在分离的 Hibernate 代理上设置 id?

发布于 2024-10-18 03:03:12 字数 1046 浏览 6 评论 0原文

我正在使用该对象,它有超过 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 创建克隆(值对象),我直接使用分离的 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字段时的代理初始化(尽管在获取时不这样做)...

提前致谢!

I'm using the object, which has over 15 related entities (parents). In my UI side I need only the ids of these entities, so I don't need Hibernate's fetch functionality and I use the lazy proxy concept to avoid the hit to database on the one hand and to have the objects with populated ids on the other.

To achieve this I have to use property acces instead of field access for all parent entities:

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

So far so good, I load the object from database (no extra joins are made) and show it on the web UI with all relations (simple select inputs at most). I don't create clones (value objects) for UI, I use the detached hibernate objects directly. But when I do any changes to UI (change the parent object) the framework calls setId() for related proxy entities and .... this results in initialization of these proxies! Here is the code from Hibernate BasicLazyInitializer which does this:

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

and the LazyInitializationException occurs (sure, I have no session at this point of time!).

So, is there any approach to do this without creation of value objects for all entities, fetched from database? I can say, that I always used data objects in UI directly, but they all were fetched completely (not proxies) and I haven't had such problems as now with these proxies...

I really don't understand, why Hibernate makes the proxy initialization on setting (though doesn't do on getting) the @ID field...

Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文