2

当我加载一个包含延迟加载字段的实体并且我想通过带有 ActiveMQ 的对象消息发送该实体时,我会收到:

  1. 完整实体(加载了延迟加载字段)或
  2. 发送的实体(没有加载延迟加载字段)?

在任何情况下,我都需要将 Serializable 标记放在我的实体中吗?

如果是答案 1,我需要做什么才能获得答案 2 中描述的实体?

4

1 回答 1

0

假设您有一个带有一些延迟加载字段的实体,如下所示:

@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 远程延迟加载。我不打算解释这一点,因为它似乎超出了问题的范围。;-)

于 2012-09-10T12:01:52.307 回答