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

我不知道端点序列化这些类的合理方法。当前代码生成的 JSON 看起来类似于以下内容:

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

最好的办法是定义一个(或多个)类以通过网络发送,而不是定义 JPA 实体,后者将 JSON 定义为无限多的层次。

于 2013-02-22T21:28:07.220 回答
1

显然,您的消息与 JPA 持久性无关,而是与杰克逊有关(大概与您如何将这些对象传回有关?)。只有您知道从哪里调用它。从您的帖子中不清楚您的实际持久性操作是否成功,因为您没有生成堆栈跟踪和其余的持久性代码(例如 Jackson 调用的来源)

于 2013-02-23T08:01:02.527 回答