当我加载一个包含延迟加载字段的实体并且我想通过带有 ActiveMQ 的对象消息发送该实体时,我会收到:
- 完整实体(加载了延迟加载字段)或
- 发送的实体(没有加载延迟加载字段)?
在任何情况下,我都需要将 Serializable 标记放在我的实体中吗?
如果是答案 1,我需要做什么才能获得答案 2 中描述的实体?
当我加载一个包含延迟加载字段的实体并且我想通过带有 ActiveMQ 的对象消息发送该实体时,我会收到:
在任何情况下,我都需要将 Serializable 标记放在我的实体中吗?
如果是答案 1,我需要做什么才能获得答案 2 中描述的实体?
假设您有一个带有一些延迟加载字段的实体,如下所示:
@Entity
public class Foo
{
@Id
private Long id;
@OneToMany
private List<Bar> bars;
}
当您从数据库中收到此实体时,只会id
加载该字段,因为该bars
字段是延迟加载OneToMany
的(默认为延迟加载)。现在,当您通过 JMS 传递此实体时,例如,该bars
字段未初始化,因为getBars()
未调用该方法。当远程端调用 getter 时,它将获得 a LazyInitializationException
,因为实体已分离且集合未初始化。
但是,如果您希望远程端能够调用getBars()
您需要以某种方式初始化集合的方法。您可以使用@OneToMany(fetch = FetchType.EAGER)
. 另一种方法是使用单独的查询来预先加载实体(这是我个人的偏好)。
例子:
select f from Foo f join fetch l.bars
如果您真的想疯狂并希望在远程端延迟初始化集合,您可以查看使用 RMI 的 Hibernate 远程延迟加载。我不打算解释这一点,因为它似乎超出了问题的范围。;-)