如何使用JPA与AppEngine设置ManyToOne关系? [英] How do I setup a ManyToOne relationship using JPA with AppEngine?

查看:125
本文介绍了如何使用JPA与AppEngine设置ManyToOne关系?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直试图通过JPA与AppEngine中的两个实体建立关系,并且正在运行这个错误:

  java.io.IOException:com.google.appengine.repackaged.org.codehaus.jackson.map.JsonMappingException:无限递归(StackOverflowError)(通过引用链

我的实体看起来像这样:

  @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 
公共类MyMessage {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
私钥键;

@ManyToOne(可选= false)
私有MyUser用户;

}

用户已经存在,这里是我插入新消息并获得递归的地方错误:

  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,以避免持久抱怨持久化已存在的子级所拥有的父级。

解决方案

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

  // 1 
{
key:foo,
messages:[
{
key:bar,
user:{
// repeat 1
},
//等等...
}

最好的办法是定义一个类(或多个类)通过线路发送,而不是JPA实体,这些实体将JSON定义为无限多个层次。

I've been trying to get a relationship working with 2 entities in AppEngine, using JPA, and am currently running into this error:

java.io.IOException: com.google.appengine.repackaged.org.codehaus.jackson.map.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain

My entities look like this:

@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;
}

and this:

@Entity
public class MyMessage {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key key;

    @ManyToOne(optional=false)
    private MyUser user;

}

The user already exists, and here is where I'm inserting a new message and get the recursion error:

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);

How am I supposed to setup this relationship within JPA and AppEngine guidelines? Thank you!

UPDATE

My problem was involving Jackson, not JPA. The JPA relationship is fine, but I needed to remove the relationship and manage it through the code as it was causing infinite recursion in serializing messages referring to users referring to messages and so on. I've also had to make sure that I annotated the user property in MyMessage as @Transient to avoid persistence complaining about persisting a parent owned by a child which already existed.

解决方案

I'm unaware of a reasonable way for Endpoints to serialize these classes. The JSON resulting from your current code would look smiilar to the following:

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

Your best bet is to define a class (or classes) to send over the wire, instead of your JPA entities, which define JSON an infinite number of levels deep.

这篇关于如何使用JPA与AppEngine设置ManyToOne关系?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆