GAE + JPA + JsonMappingException +您刚刚尝试访问字段

时间:2014-12-13 23:44:29

标签: google-app-engine jpa lazy-evaluation

我是JPA和GAE的新人。我试图将一些实体追溯到前端时遇到了一些问题。我复制mi实体代码:

@Entity
public class User implements Serializable{


   private static final long serialVersionUID = -7949567692618870100L;

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

   private String userName;

   private String email;

   @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL)
   private List<User> friends;

   @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
   private Credential Credential;

   //getters & setters
}

Credential实体仅包含userName并传递:

@Entity
public class Credential implements Serializable{


  private static final long serialVersionUID = -3277842132830057420L;

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

  private String userName;

  private String pass;

  //getters and setters
}

我使用GAE Eclipse插件生成UserEndpoint然后我添加了一个模拟Login的方法,这是方法:

@ApiMethod(name = "CredentialLogin")
public User CredentialLogin(@Named("pass") String pass,@Named("userName") String userName){
    EntityManager mgr = getEntityManager();

    Query query = mgr.createQuery("SELECT FROM User u WHERE u.email = :email");
    query.setParameter("email", userName);

    User user = null;
    try {
        user = (User) query.getSingleResult();
        if (!user.getCredential().getPass().equals(pass))
            //INVALID LOGIN
    } 
    finally {
        mgr.close();
    }
    return user;
}

调试代码我从数据存储中获取了正确的用户。做&#34; user.getCredential()&#34;凭据获取到用户实体。作为&#34;朋友&#34;当我返回User实体时,字段有LAZY取出我将显示为NULL(这就是我想要的)。

返回后我收到此错误:

&#34; com.google.appengine.repackaged.org.codehaus.jackson.map.JsonMappingException:您刚刚尝试访问字段&#34;朋友&#34;分离对象时,此字段未分离。要么不访问此字段,要么在分离对象时将其分离。&#34;

我不想把EAGER提取给我的朋友&#34;属性,因为列表可能非常大。 我不想删除我的朋友&#34; getter和setter方法,因为没有它们我无法访问该字段。

有人知道我该怎么做。

非常感谢

1 个答案:

答案 0 :(得分:0)

您可以更改增强过程以调用侦听器,而不是在访问未分离字段时抛出异常。请参阅http://www.datanucleus.org/products/accessplatform_3_1/enhancer.html和“detachListener”选项