JPA休眠想偷懒负载返回空集(JPA Hibernate want lazy load to ret

2019-09-01 07:58发布

我使用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(),我想它填满。

下图显示了答复存储在列表中。 他们没有在他们的任何值whitch我相信是因为懒加载意味着他们还没有真正从数据库中获取代理实体? 请更正,如果我错了。 作为一个侧面说明,如果有可能存储列表作为ArrayList或者其他一些标准的列表实现,将是巨大的。 据我所知,JPA希望persistentBag / persistentSet符号,因为他们可以拥有标准的实施不允许,可能有一些其他的原因藏汉重复值。 但是对于序列化模型到客户端将是巨大的不需要的库,他们也似乎没有与Android合作,因为该SSID似乎采用了android当库改变。

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

Answer 1:

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

  1. 我不知道如果LazyCollectionOption.EXTRA是适合你在这种情况下,打开你的SQL日志,看看哪些查询由Hibernate真正执行
  2. 你注释集合的getter所以这可能是适用于您(从引用博客) 如果该类org.hibernate.collection.PersistentBag,你使用bag语义现在收集将贪婪加载的所有项目的第一次触摸在列表中的任何项目。
  3. 它有可能是客户端和服务器在不同的时间(机器人类版本与服务器类版本)升级,我不会在方案中,使用ObjectOutputStream。 你将自己安全了很多这些类型的问题,麻烦,如果你序列化到XML或JSON。 例如使用XStream(不使用默认的XStream-XML序列化,但因为它包含了整个班级名称,使用别名),你可以告诉哪些字段通过注释或显式序列化之前忽略的串行器。


文章来源: JPA Hibernate want lazy load to return empty collection