3

JPAを使用してAppEngineの2つのエンティティとの関係を構築しようとしていますが、現在このエラーが発生しています。

java.io.IOException: com.google.appengine.repackaged.org.codehaus.jackson.map.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain

私のエンティティは次のようになります。

@Entity
public class MyUser {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key key;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user", cascade = CascadeType.ALL)
    private List<MyMessage> messages;
}

この:

@Entity
public class MyMessage {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key key;

    @ManyToOne(optional=false)
    private MyUser user;

}

ユーザーはすでに存在します。ここで、新しいメッセージを挿入して再帰エラーを取得します。

EntityManager mgr = getEntityManager();
MyUser myuser = mgr.find(MyUser.class, KeyFactory.createKey("MyUser", user.getEmail()));
mymessage.setUser(myuser);
myuser.addMessage(mymessage);
mgr.persist(myuser);
mgr.persist(mymessage);

JPAとAppEngineのガイドライン内でこの関係をどのように設定する必要がありますか?ありがとうございました!

アップデート

私の問題は、JPAではなくジャクソンに関するものでした。JPAの関係は問題ありませんが、メッセージを参照するユーザーなどを参照するメッセージのシリアル化で無限の再帰が発生するため、関係を削除してコードで管理する必要がありました。また、MyMessageのユーザープロパティに@Transientという注釈を付けて、既存の子が所有する親の永続化について不平を言うのを避ける必要がありました。

4

2 に答える 2

1

明らかに、あなたのメッセージはJPAの永続性とは関係がなく、Jacksonと関係があります(おそらく、これらのオブジェクトをどのように戻すかに関係していますか?)。それがどこから呼び出されるかを知っているのはあなただけです。実際の永続化操作が成功するかどうかは、スタックトレースと残りの永続化コード(Jackson呼び出しの発信元など)を生成しないため、投稿からは明らかではありません。

于 2013-02-23T08:01:02.527 に答える
1

エンドポイントがこれらのクラスをシリアル化する合理的な方法を知りません。現在のコードから生成される JSON は、次のようになります。

// 1
{
  "key": "foo",
  "messages": [
    {
      "key": "bar",
      "user": {
        // repeat 1
    },
  // and so on...
}

あなたの最善の策は、JSON を無限のレベルの深さで定義する JPA エンティティの代わりに、ワイヤ経由で送信するクラス (または複数のクラス) を定義することです。

于 2013-02-22T21:28:07.220 に答える