我目前正在使用 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 似乎发生了变化。
我真的希望这是可能的。提前谢谢!