我一直在尝试使用 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 以避免持久性抱怨持久化已存在的子级拥有的父级。