我一直在試圖讓一個關係與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