当集合的元素被删除时,刷新具有集合的实体会引发 UnresolvableObjectException
我们有一个使用 Hibernate 的两层 Swing 应用程序。有时,我们在一个会话 (A) 中操作一个对象,我们在另一个会话 (B) 中也知道该对象(两个不同的 Java 实例,相同的数据库记录)。
在本例中,在提交并关闭 A 后,我们刷新会话 B 中的对象,以便在 UI 中显示更新后的状态。在大多数情况下工作正常。
但是,如果我们有一个包含 Y 集合的对象 X,我们会遇到以下事件序列的问题:
B:加载 X 和 Y
A:加载 X 和 Y
A:从集合和数据库中删除一个 Y
A:刷新,提交并关闭会话
B:刷新 X
在最后一步中,我们得到了似乎发生的 UnresolvableObjectException,因为 B X 保留其集合(而不是刷新集合本身)并尝试刷新 Y 的每个包含的实例,这当然会失败当到达已删除的那个时。
如果刷新集合时发现类似问题的问题描述,但
无解决方案
无错误报告
无解释,这是设计使然
所以这些是我的问题:我怎样才能解决我的问题(即使是指向源代码的指针并发布“修复此处”也会有帮助)?这是一个错误吗?如果有,它是已知的吗?
We have a two tier Swing application using Hibernate. Sometimes we manipulate an object in one session (A), which we know in another session (B) as well (two different Java Instances, same database record).
In this case after commit and closing of A, we refresh the object in session B, in order to show the updated state in the UI. Works fine in most of the cases.
But if we have an object X with a collection of Ys we get a problem with the following sequence of events:
B: load X and Ys
A: load X and Ys
A: remove one Y from the collection and the database
A: flush, commit and close the session
B: refresh X
At the last step we get a UnresolvableObjectException which seems to happen, because B the X keeps its collection (instead to refreshing the collection itself) and tries to refresh each contained instance of Y which of course fails when reaching the deleted one.
If found problem descriptions about similar problems when refreshing collections, but
no solution
no bug report
no explanation, that this is by design
So these are my questions: How can I solve my problem (Even a pointer into the source code with a post it 'fix here' would be of help)? Is this a bug? If so, is it a known one?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
是的,正是这样。我也可以重现这个错误。我认为这是 Hibernate 中的一个错误。
你能做的是:
在线程B中使用
而不是session.refresh(X)。然后它就可以工作了。
Yes, it is exactly like this. I can reproduce this error, too. In my opinion it is an error in Hibernate.
What you can do is:
Use
instead of session.refresh(X) in thread B. Then it works.