1

Hibernate を使用して単純な POJO をテーブルにマップしています。これはうまく機能します。

public class Patient implements Serializable {

    private int    patientId;
    private String firstName;
    private String lastName;
    private Set<Prescription> patientPrescriptions;

    public Patient() {}

    ...
}

私の問題は、オブジェクトをシリアル化できるようにして、GWT-RPC 呼び出しのためにネットワーク経由でオブジェクトを取得できるようにしたいことです。非同期サービスがこのオブジェクトを返すと、エラーが発生します。

com.google.gwt.user.client.rpc.SerializationException: タイプ 'org.hibernate.collection.PersistentSet' が、この SerializationPolicy によってシリアル化できるタイプのセットに含まれていないか、そのクラス オブジェクトをロードできませんでした。セキュリティ上の理由から、この型はシリアル化されません。

これは、 Setをシリアル化できないという事実によるものだと思います。これは、インターフェイスであるためシリアル化できないためです。一方、Hibernate が動作するにはコレクション インターフェイス (Set/Map) が必要です。これは、Hibernate でマップされたオブジェクトを送信できなくなったことを意味しますか? セットをシリアル化する「簡単な」方法はありますか?

ありがとうございました。

4

2 に答える 2

2

このシリアライゼーションの問題をどのように克服したかについての詳細を追加するだけです:

1- 2 つのデータ モデル オブジェクトがあります (これはひどいですが、学校のプロジェクトでこれをクリーンアップする時間がありません)。

// The persistent data model class
public class PatientPersistent implements Serializable {
    ...

    Set<Prescription> patientPrescriptions;

    ...
}

// The serializable over the wire (GWT-RPC) data model class
public class Patient implements Serializable {
    ...

    Set<Prescription> patientPrescriptions;

    ...
}

2- Dozer を使用して、persistant-model <== を ==> Serializable データ クラス Patient にマップします。このような:

Patient thePatient = mapper.map(persistentObject, Patient.class);

この患者は、非同期サービスによってクライアントに送り返されます。このマッピングの後、Patient がシリアライズ不可能な hibernate バージョンではなく、java.util からの HashSet<> タイプを持っていることがわかります。

于 2010-07-19T20:04:41.033 に答える
1

問題は、GWT が注釈のソース コードと使用されているクラスを見つけられないことです。GWT はオブジェクトを JS にコンパイルする必要があるため、そのソース コードが必要です。

オブジェクトをシリアライズできるようにして、GWT-RPC 呼び出し用にネットワーク経由でオブジェクトを取得できるようにしたいと考えています。

そのためにギレアデを使うことができます。(以前は Hibernate4GWT と呼ばれていました)

これは、 Set をシリアル化できないという事実によるものだと思います。これは、インターフェイスであるためシリアル化できないためです。一方、Hibernate が動作するにはコレクション インターフェイス (Set/Map) が必要です。これは、Hibernate でマップされたオブジェクトを送信できなくなったことを意味しますか? セットをシリアル化する「簡単な」方法はありますか?

問題は ではなくSet、GWT は GWT-RPC を介してコレクションを非常にうまくシリアル化できます。ただし、送信中はHashSet、汎用インターフェイスの代わりに、特定の実装を最適化できるようにするために、特定の実装を使用する必要があります。

于 2010-07-19T16:04:43.307 に答える