我一直在试图让一个关系与2个实体的AppEngine,使用JPA的工作,和我目前遇到了此问题:如何使用AppEngine使用JPA设置ManyToOne关系?
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指南中建立这种关系?谢谢!
UPDATE
我的问题是涉及杰克逊,而不是JPA。 JPA关系很好,但我需要删除关系,并通过代码进行管理,因为它导致序列化消息中的无限递归,指向引用消息的用户等等。我还必须确保我将MyMessage中的用户属性注释为@Transient,以避免持久抱怨持久化已存在的子项所拥有的父项。
我不确定我明白为什么。基于示例,我使用支持的注释。你为什么说这些数据类不被支持?另外,我得到的错误与持久性有关,而不是云端点。任何帮助表示赞赏,谢谢! https://github.com/branflake2267/CloudEndPoints/blob/master/DemoCloudEndpoints/src/org/gonevertical/server/data/User.java – piusvelte 2013-02-23 02:10:52
对不起,我回想起看到一个包含列表或集合的类的例子财产,但我现在找不到一个。尽管AppEngine的数据存储让人望而却步,但我想我必须将数据rdbms风格变平。 – piusvelte 2013-02-23 02:21:09
您可以返回一个列表(作为返回类型或在实体类中)。不支持的类是无限地相互引用的类(这是错误的含义)。您应该定义一个不同的类,以不会导致此类递归的方式对您的响应进行建模,并在将数据存储实体中的数据返回到这些新的类之前,将它们返回到Endpoint中。我会更新我的答案以反映这一点。 – 2013-02-24 01:09:40