Java com.google.appengine.repackage.org.codehaus.jackson.map.JsonMappingException,同时实现一对多双向关系应用程序引擎
我想为我的应用程序引擎应用程序实现一对多双向关系。以下是我的实体:Java com.google.appengine.repackage.org.codehaus.jackson.map.JsonMappingException,同时实现一对多双向关系应用程序引擎,java,android,json,google-app-engine,google-cloud-datastore,Java,Android,Json,Google App Engine,Google Cloud Datastore,我想为我的应用程序引擎应用程序实现一对多双向关系。以下是我的实体: @Entity public class UserMaster { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Key key; private String userName; @OneToMany(mappedBy = "user") List<FeedMaster> feeds;
@Entity
public class UserMaster {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;
private String userName;
@OneToMany(mappedBy = "user")
List<FeedMaster> feeds;
getter()...setter() for all properties
}
@Entity
public class FeedMaster {
@Id
private String feedId;
@ManyToOne(fetch = FetchType.LAZY)
UserMaster user;
getter()....setter() for both properties
}
我搜索了很多,但找不到任何解决方案。我在这里提到过,他们说要删除
FeedMaster
中UserMaster
的getter setter,但是如果我删除了它,那么我将无法通过FeedMaster
对象访问UserMaster
数据。请帮我解决这个问题。谢谢。这里发生的事情是Jackson库发现了一个无法转换为JSON的循环。在返回此对象时,您必须决定在哪里返回关系,在哪里不返回关系
您的代码意味着您可以从UserMaster
访问FeedMaster
,也可以从FeedMaster
访问UserMaster
。这在您的应用程序级别上是非常好的,但是当您将这个对象图序列化为JSON时,您将不得不放弃其中一个关系,因为它将导致JSON表示上的无休止的循环
为此,您可以使用@JsonIgnore
注释,如下所示:
import com.fasterxml.jackson.annotation.JsonIgnore;
@Entity
public class FeedMaster {
@Id
private String feedId;
@ManyToOne(fetch = FetchType.LAZY)
UserMaster user;
@JsonIgnore
public UserMaster getUser() {
...
}
}
在这种情况下,您的JSON将允许您访问
UserMaster
中的所有FeedMaster
对象,但不能访问FeedMaster
中的UserMaster
对象。您可能已经了解到这一点,但有一种可能性是您正在使用“key”作为您的@Id的成员字段名。在过去几个小时里,我已经阅读了appengine上的4-5个不同教程,并记得他们在某个地方特别指出不要使用“key”这个词作为您的key,因为它与内部数据存储impl相冲突。(我在这个线程上结束的方式是,我正试图找出JsonMappingException的另一个问题,关于这些错误的资源太少了…)
试着改变
private Key key;
到
看看这能不能解决问题
private Key key;
private Key k; // obv use a better name such as id for real code (though k may be a reasonable convention in your codebase