如何在不同的项目中将JPA对象与GWT一起使用?

时间:2010-12-30 16:07:11

标签: gwt jpa

我是GWT的新手,我正在设置一个项目来保存复杂应用程序的UI部分。 JPA数据对象使用MyBatis生成的POJO在单独的项目中定义。一旦我手动修改JPA对象以包含'implements Serializable'(这是我需要解决的另一个问题),构建过程中的gwtc步骤无法继续,因为它需要JPA对象的源代码,但可以'找到他们。

我创建了'核心'项目的jar文件,以便它包含源.java文件,但这不起作用。我已经尝试在gwtc ant java调用中添加一个classpath元素。

如何在保持JPA对象在单独项目中定义的同时编译我的UI项目?

错误:

Buildfile: /Users/user/source/user_interface/build.xml

libs:

javac:

gwtc:
     [java] Compiling module org.mysite.ui
     [java]    Validating newly compiled units
     [java]       [ERROR] Errors in 'file:/Users/user/source/user_interface/src/org/mysite/ui/client/MyService.java'
     [java]          [ERROR] Line 21: No source code is available for type org.mysite.core.model.Person; did you forget to inherit a required module?
     [java]       [ERROR] Errors in 'file:/Users/user/source/user_interface/src/org/mysite/ui/client/MyServiceAsync.java'
     [java]          [ERROR] Line 19: No source code is available for type org.mysite.core.model.Person; did you forget to inherit a required module?
     [java]       [ERROR] Errors in 'file:/Users/user/source/user_interface/src/org/mysite/ui/client/presenter/MainTabPresenter.java'
     [java]          [ERROR] Line 75: No source code is available for type org.mysite.core.model.Person; did you forget to inherit a required module?
     [java]    Scanning for additional dependencies: file:/Users/user/source/user_interface/src/org/mysite/ui/client/MyApp.java
     [java]       Computing all possible rebind results for 'org.mysite.ui.client.MyService'
     [java]          Rebinding org.mysite.ui.client.MyService
     [java]             Checking rule <generate-with class='com.google.gwt.user.rebind.ui.ImageBundleGenerator'/>
     [java]                [ERROR] Unable to find type 'org.mysite.ui.client.MyService'
     [java]                   [ERROR] Hint: Previous compiler errors may have made this type unavailable
     [java]                   [ERROR] Hint: Check the inheritance chain from your module; it may not be inheriting a required module or a module may not be adding its source path entries properly
     [java]    [ERROR] Errors in 'file:/Users/user/source/user_interface/src/org/mysite/ui/client/MyApp.java'
     [java]       [ERROR] Line 23:  Failed to resolve 'org.mysite.ui.client.MyService' via deferred binding
     [java]    [ERROR] Cannot proceed due to previous errors

BUILD FAILED
/Users/user/source/user_interface/build.xml:39: Java returned: 1

Total time: 26 seconds

Ant gwtc target:

  <target name="gwtc" depends="javac" description="GWT compile to JavaScript (production mode)">
    <java failonerror="true" fork="true" classname="com.google.gwt.dev.Compiler">
      <classpath>
        <pathelement location="src"/>
        <pathelement location="../core/src"/>
        <path refid="project.class.path"/>
      </classpath>
      <!-- add jvmarg -Xss16M or similar if you see a StackOverflowError -->
      <jvmarg value="-Xmx256M"/>
      <arg line="-war"/>
      <arg value="web"/>
      <!-- Additional arguments like -style PRETTY or -logLevel DEBUG -->
      <arg line="${gwt.args}"/>
      <arg value="org.mysite.ui.MyApp"/>
    </java>
  </target>

3 个答案:

答案 0 :(得分:3)

GWT一直都有这个问题。

我过去采用的方法是在另一个JAR中创建一个.gwt.xml模块,包括JPA POJO,并将JPA注释类放在“emul”javax.persistence文件夹中。当然,这对于许多使用延迟抓取的提供程序都不起作用,因此需要Gilead(在此处的另一个答案中提到)。

另一种方法是在通过RPC

发送之前制作JPA对象的副本并只创建Dozer

幸运的是,GWT 2.1解决了这个问题。使用Entity proxies并请求工厂。效果很好。

答案 1 :(得分:2)

  1. 使用新的GWT 2.1 RequestFactory / EntityPro xy方法,或者

  2. 更好,抛弃JPA并使用ObjectifyTwig

  3. 我们使用Objectify,因为JPA不适合数据存储。 JPA是在考虑基于SQL的关系数据库的情况下创建的,而GAE数据存储则完全不同。

    谷歌将JPA层移植到数据存储区以引诱开发人员,假装数据存储只是一个普通的旧SQL关系数据库。一旦项目变得越来越大,这种情况随后就会爆发出来。

    如果您想使用AppEngine,您真的需要了解数据存储区的权衡。 JPA在这里没有帮到你。

答案 2 :(得分:0)

如果您想将POJO序列化为GWT,最好的办法是使用Gilead http://noon.gilead.free.fr/gilead/

您在POJO上所要做的就是扩展LightEntity并实现Serializable

本教程非常简单地介绍了如何设置RPC。