1

現在 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でも動作しないようです.

返信が返された画像

これが可能になることを本当に願っています。事前にt​​hx!

4

1 に答える 1

0

このブログに出くわしました: https://sites.google.com/a/pintailconsultingllc.com/java/hibernate-extra-lazy-collection-fetching

  1. このシナリオで LazyCollectionOption.EXTRA が適切かどうかはわかりません。sql-logging をオンにして、休止状態によって実際に実行されるクエリを確認してください。
  2. Collection getter に注釈を付けたので、これはあなたに適用される可能性があります (参照されたブログから)リスト内の任意のアイテム。
  3. クライアントとサーバーが異なる時点でアップグレードされる可能性があるシナリオ (Android クラスのバージョンとサーバー クラスのバージョン) では、ObjectOutputStream を使用しません。xml または json にシリアル化すると、これらの種類の問題で多くの問題を回避できます。たとえば、xstream (デフォルトの xstream-xml シリアライゼーションは使用しないでください。ただし、クラス名全体が含まれているため、エイリアスを使用してください) では、シリアライズする前に、注釈または明示的にどのフィールドを無視するかをシリアライザーに伝えることができます。
于 2013-04-30T08:53:22.830 に答える