问题 Android中的JPA注释


我们有一个在服务器端使用JPA / Hibernate的项目,映射的实体类在它们自己的Library-Project中,并使用Annotations映射到数据库。我想在Android项目中使用这些类 - 有没有办法忽略Android中的注释,将这些类用作标准POJO?


11805
2017-10-27 14:16


起源



答案:


只要您的类路径中包含带有JPA注释类的jar,编译器就不会在意。如果不存在运行时检测系统(例如Hibernate),则注释只是那些但不使用的额外信息。唯一的问题是确保在您的发行版中包含JPA jar。


7
2017-10-27 14:32



这可能是个问题。我真的不想将所有hibernate-JAR捆绑到Android-Project中。 - dasmaze
如果您无法捆绑所需的类,那么我能想到的唯一解决方案是使用自定义类加载器从字节码中删除注释。这是一项非常重要的任务,但可行。 - alphazero
附:字节码转换不一定必须在加载时发生。另一种选择是在服务器库上运行一个进程,并通过生成一组新的类文件来为android清理它们。 - alphazero


答案:


只要您的类路径中包含带有JPA注释类的jar,编译器就不会在意。如果不存在运行时检测系统(例如Hibernate),则注释只是那些但不使用的额外信息。唯一的问题是确保在您的发行版中包含JPA jar。


7
2017-10-27 14:32



这可能是个问题。我真的不想将所有hibernate-JAR捆绑到Android-Project中。 - dasmaze
如果您无法捆绑所需的类,那么我能想到的唯一解决方案是使用自定义类加载器从字节码中删除注释。这是一项非常重要的任务,但可行。 - alphazero
附:字节码转换不一定必须在加载时发生。另一种选择是在服务器库上运行一个进程,并通过生成一组新的类文件来为android清理它们。 - alphazero


实际的JPA注释是Java SE 6的一部分,而不是hibernate。因此,您不需要让Hibernate JAR能够使用JPA带注释的类。 所有你需要的是声明你引用的注释的类/接口,如果你能负担得起,完整的JPA api jar大约是50k。


5
2018-05-29 11:39



不是吗 Java EE 6? - Jin Kwon


我刚遇到这个问题,因为我使用maven来构建我的android项目,所以我添加了这个依赖项

 <dependency>
     <groupId>org.hibernate.javax.persistence</groupId>
     <artifactId>hibernate-jpa-2.0-api</artifactId>
     <version>1.0.1.Final</version>
    </dependency>

0
2018-03-01 09:21





您可以使用 Cmobilecom JPA 对于android和java。它实现了JPA 2.1规范。所以你所有的java JPA注释都适用于android而不做任何改动。只需在项目中添加以下依赖项即可。

安卓:

dependencies {
    implementation("com.cmobilecom:cmobilecom-jpa-android:${version}@aar") {
        transitive = true
    }

    annotationProcessor "com.cmobilecom:cmobilecom-jpa-processor:$version"
}

JDBC:

dependencies {
    implementation "com.cmobilecom:cmobilecom-jpa-jdbc:$version"

    // annotation processor: generate static metamodel
    compileOnly "com.cmobilecom:cmobilecom-jpa-processor:$version"
}

免责声明:我是Cmobilecom JPA的开发人员。


0
2017-08-28 21:43