1

我目前正在使用 JPA-Hibernate,并且希望集合为空,直到我调用关联的 get()。我已经尝试了几天,但没有任何成功。我想要这个的原因是因为我使用 Exterialize(或序列化)并且在将序列化字符串发送到客户端时并不总是希望集合在那里。

@Entity
public class Thread implements Externalizable {
    static final long serialVersionUID = 9L;


@OneToMany(mappedBy = "parentThread", fetch = FetchType.LAZY)
    @LazyCollection(LazyCollectionOption.EXTRA)
    public Collection<Reply> getReplies() {
        return replies;
    }

这是回复模型:

@Entity
public class Reply implements Externalizable {
    static final long serialVersionUID = 8L;

    @ManyToOne
    @JoinColumn(name = "threadId", referencedColumnName = "id", nullable = false)
    public Thread getParentThread() {
        return parentThread;
    }

这段代码是我用来序列化模型的:

public static final String serialize(Serializable object) throws IOException, ClassNotFoundException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream( baos );
    oos.writeObject( object );
    oos.close();
    BASE64Encoder base64Encoder =  new BASE64Encoder();
    return  new String( base64Encoder.encode(baos.toByteArray()));
}

这就是我用来查找线程对象的方法

models.Thread thread = em.find(models.Thread.class, threadId);

如果我使用 entityManager.find() 或查询,它仍会加载回复列表。所以要特别清楚,我希望在生成实体时集合为空。然后,如果我调用 get() 我希望它填满。

下图显示回复存储在列表中。它们中没有任何值,我认为是因为延迟加载意味着它们是尚未真正从数据库中获取的代理实体?如果我错了,请纠正。作为旁注,如果可以将列表存储为 arraylist 或其他一些很棒的标准列表实现。我知道 JPA 需要 persistentBag/persistentSet 表示法,因为它们可能具有标准实现不允许的重复值,并且可能还有其他一些原因。但是为了将模型序列化到客户端,最好不需要库,而且它们似乎也不适用于 android,因为使用 android 时库中的 SSID 似乎发生了变化。

带有返回回复的图片

我真的希望这是可能的。提前谢谢!

4

1 回答 1

0

我偶然发现了这个博客:https ://sites.google.com/a/pintailconsultingllc.com/java/hibernate-extra-lazy-collection-fetching

  1. 我不确定 LazyCollectionOption.EXTRA 在这种情况下是否适合您,请打开您的 sql-logging 以查看 hibernate 真正执行了哪些查询
  2. 您注释了 Collection getter,因此这可能适用于您(来自引用的博客)列表中的任何项目。
  3. 我不会在客户端和服务器可能在不同时间升级的情况下使用 ObjectOutputStream(android 类版本与服务器类版本)。如果您序列化为 xml 或 json,您将在这些问题上遇到很多麻烦。例如使用 xstream(不要使用默认的 xstream-xml 序列化,因为它包含整个类名,使用别名),您可以在序列化之前通过注释或显式告诉序列化程序忽略哪些字段。
于 2013-04-30T08:53:22.830 回答