【问题标题】:GoogleJsonResponse exception while persisting/retrieving entity in appengine在应用引擎中持久化/检索实体时出现 GoogleJsonResponseexception
【发布时间】:2014-08-12 05:58:05
【问题描述】:

我正在开发带有appengine后端的android应用程序。有两个实体类,用户和书,在双向一对多关系中。书实体由用户实体中的书(ArrayList)字段引用。当我尝试插入书籍实体并在客户端接收插入的实体时,我在客户端应用程序中收到 GoogleJsonResponseException 异常。异常消息状态:

com.google.appengine.repackaged.org.codehaus.jackson.map.JsonMappingException:您刚刚尝试访问字段“所有者”,但在您分离对象时该字段未分离。要么不要访问该字段,要么在分离对象时将其分离。

这就是我插入书籍实体的方式:

    try {

            Book retrievedBook=endpoint.insertBook(registeredNumber, b).execute();
            if(retrievedBook!=null){
                String message="Success";

            }
        } catch (Exception e) {
            //THE ERROR IS CAUGHT HERE
            e.printStackTrace();

        }

UserEndpoint 中的 insertBook 方法:

    @ApiMethod(name = "insertBook")
 public Book insertBook(Book book,@Named("userRegistrationNumber")String userRegistrationNumber) {
    EntityManager mgr = getEntityManager();
    try {
        UserEndpoint ue=new UserEndpoint();



        mgr.getTransaction().begin();

        User u=mgr.find(User.class, userRegistrationNumber);


        u.setBook(book);        

        mgr.flush();
        mgr.getTransaction().commit();

        //To check if key is generated.
          String keyString=KeyFactory.keyToString(book.getBookId());


        //TESTED OK:Check if book is inserted properly..
        User uCheck=mgr.find(User.class, userRegistrationNumber);
        Book b uBooks=(ArrayList<Book>)uCheck.getBooks()get(0);

        //TESTED OK:Testing if able to get owner from book entity...
        User owner=b.getUser();

        return book;

    }catch(Exception e){
        mgr.getTransaction().rollback();
        return null;
    }
    finally {

        mgr.close();
    }

}

客户端如何接收插入的Book实体?

用户实体类:

@Entity
public class User {
@Id
private String id;
//private String registeredNumber;

private  String userName;
private int sexId;
private String userAddress;
private String pinNumber;
private int ratingCount;
private int reportCount;

private String emailId;
private String interestAreaSubjectId;
private String sharingPolicy;

@OneToMany(targetEntity=com.example.bookemon.Book.class,
        mappedBy="owner",cascade=CascadeType.ALL)
private ArrayList<Book> books;

 //getters and setters...


}

图书实体类:

  @Entity
 public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key bookId;


private String bookName;
private String bookDescription;
private int categoryId;
private String  publicationYear;
private int reportCount;
private int languageId;
private int ratingCount;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="OWNER_ID")
public User owner;

     ////Getters and setters......

}

【问题讨论】:

    标签: java android google-app-engine jpa


    【解决方案1】:

    错误信息非常清楚。当您分离对象(关闭 PM?)时,对象中没有该字段,因此,如果您以后需要它,您应该在关闭 PM 之前加载它。

    【讨论】:

    • 我只在 finally 块中关闭实体管理器。那样的话,错误应该不会发生。
    • 请告诉我们为什么“错误不应该发生”。您有一个对象,并且在传递出持久性上下文时未加载一个字段。您需要确保已加载该字段(EAGER 设置或 FetchPlan)。你没有上课
    • 我已插入实体类代码。请检查实体类是否有错误。
    • 所以 owner 字段被标记为 LAZY,所以默认不会加载。所有 JPA 文档,特别是您的 JPA 提供者的文档,都会告诉您如何确保在分离时加载它
    猜你喜欢
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 2013-08-09
    • 2017-09-27
    • 1970-01-01
    • 2011-11-01
    相关资源
    最近更新 更多