gpt4 book ai didi

google-app-engine - 如何使用 JPA 和 AppEngine 设置 ManyToOne 关系?

转载 作者:太空宇宙 更新时间:2023-11-03 15:35:30 25 4
gpt4 key购买 nike

我一直在尝试使用 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 指南中建立这种关系?谢谢!

更新

我的问题涉及 Jackson,而不是 JPA。 JPA 关系很好,但我需要删除关系并通过代码管理它,因为它导致序列化消息引用用户引用消息等的无限递归。我还必须确保我将 MyMessage 中的用户属性注释为 @Transient,以避免持久性提示持久化已存在的子项拥有的父项。

最佳答案

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

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

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

关于google-app-engine - 如何使用 JPA 和 AppEngine 设置 ManyToOne 关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15032728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com