Google App Engine - DataNucleus JPA - 一对多 - 父/子 - EntityManager.Persist - IllegalArgumentException:out of field index:-1

时间:2013-03-23 13:04:34

标签: google-app-engine jpa datanucleus

我关于SO的第一篇文章 - 华友世纪!

我正在尝试使用他们的数据存储在Google应用引擎上创建Java REST服务。我已经启动并运行了服务&我能够存储单个实体,但是现在,我在存储具有关系的实体时遇到了问题。 (IllegalArgumentException:out of field index:-1 - 请参阅下面的堆栈跟踪)

我花了一些时间挖掘,发现有几个人能够通过重新运行数据增强器(https://groups.google.com/forum/?fromgroups=#!topic/google-appengine-java/Uc7fVnSqcL0)来解决这个问题。我重新运行增强器,我可以在eclipse中验证它正在运行&增强类(可能没有错误)。不幸的是,这还没有解决问题。

注意:显然,泽西岛在生产中不能与ASM 4.0一起使用。我不得不切换到ASM的3.1版本,最重要的是,我发现JPA 2.0不能与ASM 3.1一起使用,所以现在我要使用ASM 3.1& JPA 1.0 - 请告诉我,我错了所有这些。

过了一段时间,我在互联网上发现了一个非常基本的问题版本(有书和章节),我仍然得到同样的错误。在我的原始项目中,我甚至尝试使用KeyFactory生成相应的子父键,但得到了相同的错误:IllegalArgumentException:out of field index:-1

这是我的代码,stacktrace和我项目工作区的一些截图。如果还有什么我可以提交帮助,请告诉我。谢谢!

    import java.util.ArrayList;
    import java.util.List;
    import javax.persistence.CascadeType;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.OneToMany;

    import com.google.appengine.api.datastore.Key;

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

        private String title;

        @OneToMany(mappedBy = "book", cascade = CascadeType.ALL)
        private List<Chapter> chapters = new ArrayList<Chapter>();

        public Key getId() {
            return id;
    }

    public void setId(Key id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public List<Chapter> getChapters() {
        return chapters;
    }

    public void setChapters(List<Chapter> chapters) {
        this.chapters = chapters;
    }
}


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

        private String title;
        private int numPages;

        @ManyToOne(fetch = FetchType.LAZY)
        private transient Book book;

        public Key getId() {
            return id;
        }

        public void setId(Key id) {
            this.id = id;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public int getNumPages() {
            return numPages;
        }

        public void setNumPages(int numPages) {
            this.numPages = numPages;
        }

        public Book getBook() {
            return book;
        }

        public void setBook(Book book) {
            this.book = book;
        }
    }

我的测试REST服务:

EntityManager _em = EMF.get().createEntityManager();

@GET
@Path("/ff")
@Produces(MediaType.APPLICATION_JSON)
public Response ff() {

Book b = new Book();
b.setTitle("JPA 4eva");

Chapter c1 = new Chapter();
c1.setTitle("Intro");
c1.setNumPages(10);

Chapter c2 = new Chapter();
c2.setTitle("Configuration  - aa");
c2.setNumPages(9);

b.getChapters().add(c1);
b.getChapters().add(c2);

_em.getTransaction().begin();
try {
       _em.persist(b);
       _em.getTransaction().commit();
} finally {
    if (_em.getTransaction().isActive()) {
            _em.getTransaction().rollback();
        }
    }
    Gson gson = new Gson();
    return Response.ok(gson.toJson(b), MediaType.APPLICATION_JSON).build();
}

我将Stack Trace上传到:

StackTrace

0 个答案:

没有答案