現在 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<Reply> getReplies() {
return replies;
}
そして、ここに Reply モデルがあります:
@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を使用するとSSIDがライブラリで変更されるように見えるため、Androidでも動作しないようです.
これが可能になることを本当に願っています。事前にthx!