AppEngine + DataNucleus RDBMS + JPA 2项目在使用@OneToMany注释时抛出异常

时间:2014-01-27 16:24:35

标签: mysql google-app-engine jpa datanucleus

使用现有MySQL数据库中的JPA向导在Eclipse中创建实体类,但必须删除@OneToMany注释,因为在增强期间会弹出这些错误(使用DataNucleus Enhancer 3.1.1版)。

java.lang.RuntimeException: Unexpected exception
    at com.google.appengine.tools.enhancer.Enhancer.execute(Enhancer.java:76)
    at com.google.appengine.tools.enhancer.Enhance.<init>(Enhance.java:71)
    at com.google.appengine.tools.enhancer.Enhance.main(Enhance.java:51)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.google.appengine.tools.enhancer.Enhancer.execute(Enhancer.java:74)
    ... 2 more
Caused by: java.lang.VerifyError: Expecting a stackmap frame at branch target 40
Exception Details:
  Location:
    cultivartehidroponia/Order.getOrderItems()Ljava/util/List; @4: ifnull
  Reason:
    Expected stackmap frame at this location.
  Bytecode:
    0000000: 2ab4 004a c600 242a b400 4a2a 07b9 006f
    0000010: 0300 9a00 162a b400 4a2a 072a b601 0db9
    0000020: 0098 0400 c001 0fb0 2ab6 0056 9900 2e2a
    0000030: b400 5a05 32c0 005c 07b6 0079 9a00 1e2a
    0000040: b400 5a06 32c0 005c 07b6 0079 9a00 0ebb
    0000050: 007b 5913 0111 b700 80bf 2ab6 010d b0  

    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2531)
    at java.lang.Class.getDeclaredMethods(Class.java:1855)
    at org.datanucleus.metadata.annotations.AbstractAnnotationReader.getJavaBeanAccessorAnnotationsForClass(AbstractAnnotationReader.java:310)
    at org.datanucleus.metadata.annotations.AbstractAnnotationReader.getMetaDataForClass(AbstractAnnotationReader.java:146)
    at org.datanucleus.metadata.annotations.AnnotationManagerImpl.getMetaDataForClass(AnnotationManagerImpl.java:171)
    at org.datanucleus.metadata.MetaDataManager.loadAnnotationsForClass(MetaDataManager.java:2650)
    at org.datanucleus.metadata.MetaDataManager.loadClasses(MetaDataManager.java:496)
    at org.datanucleus.enhancer.DataNucleusEnhancer.getFileMetadataForInput(DataNucleusEnhancer.java:734)
    at org.datanucleus.enhancer.DataNucleusEnhancer.enhance(DataNucleusEnhancer.java:525)
    at org.datanucleus.enhancer.DataNucleusEnhancer.main(DataNucleusEnhancer.java:1258)
    ... 7 more

我可以使用实体,只是没有map-by字段。

要绕过此问题,我必须使用瞬态字段暂时实现此功能,例如:

@Transient private List<ViewProduct> products;

并手动模拟@OneToMany功能:

public List<ViewProduct> getProducts() {
    EntityManager em = EMF.get().createEntityManager();
    EntityTransaction trans = em.getTransaction();
    try {
        trans.begin();
        this.products = em.createNamedQuery("ViewProduct.findByProductTemplate", ViewProduct.class).setParameter("prodTemplateId", this.getProdTemplateId()).getResultList();
        trans.commit();
    }...

但这会破坏拥有这个好功能的目的......;( 可能是配置问题?但为什么其他一切都有效呢? 那里有类似错误的人吗?有什么建议吗?

提前致谢!!!

2 个答案:

答案 0 :(得分:0)

DataNucleus v3.1不受支持/开发,并且已经有一段时间了。您应该使用v3.2 +,它至少有一个修复JDK 1.7。

答案 1 :(得分:0)

如果您使用的是Eclipse和Google插件,则可能需要升级IDE。我使用的是Indigo和1.9.4,我和增强器有类似的问题。使用相关的Google插件等切换到Kepler后,问题就消失了。