这似乎是一个陈旧的问题,但我仍然有一些问题。 我创建了一个Web服务器,它将一些类共享为.jar。这是共享POJO类的一个示例
@JsonInclude(Include.NON_NULL)
@Entity
@Table(name = "user", uniqueConstraints =
{ @UniqueConstraint(columnNames = "email"),
@UniqueConstraint(columnNames = "nick") })
public class User implements java.io.Serializable, RecognizedServerEntities
{
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private Integer userId;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "threadAuthor",
orphanRemoval = false)
@Cascade({ CascadeType.SAVE_UPDATE })
private Set<Thread> userThreads = new HashSet<Thread>(0);
}
现在,我正在尝试创建一个只使用这些共享类的Android应用程序:应用程序不需要了解有关hibernate或javax.persistence的任何信息(至少,我认为是这样)。
但是,当我在Android Studio
中创建一个新项目时,似乎需要一些额外的库。实际上,gradle构建过程会产生许多警告,例如
warning: unknown enum constant CascadeType.REMOVE
reason: class file for org.hibernate.annotations.CascadeType not found
warning: unknown enum constant FetchType.EAGER
reason: class file for javax.persistence.FetchType not found
并且在运行时,应用程序崩溃并显示此日志消息
java.lang.NoClassDefFoundError: org/hibernate/annotations/Cascade
那么,我是否必须将这些.jar
作为库导入,并将compile files()
添加到build.gradle
?
我还使用Java(Swing)开发了另一个客户端应用程序,并且不需要导入这些库:shared.jar就足够了。为什么Android需要它们?
答案 0 :(得分:1)
CascadeType
和FetchType
是Java EE的一部分。
尝试使用findjar下载包含这些类的jar。
即使您将下载的jar添加到类路径中,RuntimeException
仍然会发生迁移,因为这些库可以使用不属于Android Java的Java部分。
试着给我们一个反馈:)
答案 1 :(得分:1)
现在,我正在尝试创建一个只使用这些共享类的Android应用程序:应用程序不需要了解有关hibernate或javax.persistence的任何信息(至少,我认为是这样)。
显然,确实如此。其中一些注释可能是运行时注释,在这种情况下,您需要JAR。其中一些是编译时注释可能会扩展为对这些JAR中的事物的引用,这就是我对您的错误消息的解释。
那么,我是否必须将这些.jars作为库导入并将build files()添加到build.gradle?
当然欢迎您尝试在Android上使用Hibernate,无论是通过JAR还是在Maven Central等地方使用工件。是否有适用于Android的Hibernate端口,我不能说。最后我检查过,Hibernate是为服务器端设计而设计的,可直接访问数据库,而Android应用程序专为客户端使用而设计,无需直接访问数据库(例如,使用Web服务)。