JPA Hibernate希望延迟加载返回空集合

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

@Entity public class Thread implements Externalizable { static final long serialVersionUID = 9L; @OneToMany(mappedBy = "parentThread", fetch = FetchType.LAZY) @LazyCollection(LazyCollectionOption.EXTRA) public Collection 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似乎在库中发生了变化。

返回的回复图片

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

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

  1. 我不确定在这种情况下LazyCollectionOption.EXTRA是否适合你,打开你的sql-logging来查看hibernate真正执行的查询
  2. 你注释了一个Collection getter,所以这可能适用于你(来自引用的博客) 如果这个类是org.hibernate.collection.PersistentBag,你正在使用bag语义,现在集合会在你第一次触摸时急切加载所有项目列表中的任何项目。
  3. 我不会在可能在不同时间升级客户端和服务器的情况下使用ObjectOutputStream(android类版本与服务器类版本)。 如果序列化为xml或json,那么在这些问题上你会遇到很多麻烦。 例如,使用xstream(不要使用默认的xstream-xml序列化,因为它包含整个类名,使用别名),您可以告诉序列化程序在序列化之前通过注释或明确忽略哪些字段。