java - Hibernate session 工厂 Android

标签 java android hibernate

我正在尝试在 Android 上使用 Hibernate。 (Eclipse Android 2.2 SDK)
似乎在包含

的行中存在编译错误
HibernateUtility.getSessionFactory().openSession();  

这是 HibernateUtility 类:

public class HibernateUtility {

    private static final SessionFactory sessionFactory;

    static {
        try {
            // Create the SessionFactory from standard (hibernate.cfg.xml) 
            // config file.
            sessionFactory = new Configuration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            // Log the exception. 
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

在eclipse中编译报错是:

The type javax.naming.Referenceable cannot be resolved. It is indirectly referenced from required .class files

我从我的 java sdk (Sun JDK macosx) 复制了一个文件 rt.jar,其中包含包 javax.namaing.* 并且编译错误似乎已解决。但是我现在从 Android SDK Logcat 得到了下面的运行时错误。

08-30 15:21:05.123: W/dalvikvm(240): VFY: unable to find class referenced in signature (Lorg/hibernate/SessionFactory;) 08-30 15:21:05.123: I/dalvikvm(240): Could not find method org.hibernate.SessionFactory.openSession, referenced from method com.example.testfordatabase.EtityDao.insert 08-30 15:21:05.123: W/dalvikvm(240): VFY: unable to resolve interface method 102: Lorg/hibernate/SessionFactory;.openSession ()Lorg/hibernate/classic/Session; 08-30 15:21:05.123: D/dalvikvm(240): VFY: replacing opcode 0x72 at 0x000b 08-30 15:21:05.123: D/dalvikvm(240): VFY: dead code 0x000e-003f in Lcom/example/testfordatabase/EtityDao;.insert (Lcom/example/testfordatabase/entity;)V 08-30 15:21:05.123: D/step1(240): Step1 08-30 15:21:05.133: E/dalvikvm(240): Could not find class 'org.hibernate.cfg.Configuration', referenced from method com.example.testfordatabase.HibernateUtility. 08-30 15:21:05.133: W/dalvikvm(240): VFY: unable to resolve new-instance 65 (Lorg/hibernate/cfg/Configuration;) in Lcom/example/testfordatabase/HibernateUtility; 08-30 15:21:05.133: D/dalvikvm(240): VFY: replacing opcode 0x22 at 0x0000 08-30 15:21:05.133: D/dalvikvm(240): VFY: dead code 0x0002-000f in Lcom/example/testfordatabase/HibernateUtility;. ()V 08-30 15:21:05.133: W/dalvikvm(240): VFY: unable to find class referenced in signature (Lorg/hibernate/SessionFactory;) 08-30 15:21:05.133: W/System.err(240): Initial SessionFactory creation failed.java.lang.NoClassDefFoundError: org.hibernate.cfg.Configuration 08-30 15:21:05.133: W/dalvikvm(240): Exception Ljava/lang/ExceptionInInitializerError; thrown during Lcom/example/testfordatabase/HibernateUtility;. 08-30 15:21:05.133: D/AndroidRuntime(240): Shutting down VM 08-30 15:21:05.133: W/dalvikvm(240): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 08-30 15:21:05.173: E/AndroidRuntime(240): FATAL EXCEPTION: main 08-30 15:21:05.173: E/AndroidRuntime(240): java.lang.ExceptionInInitializerError 08-30 15:21:05.173: E/AndroidRuntime(240): at com.example.testfordatabase.EtityDao.insert(EtityDao.java:35) 08-30 15:21:05.173: E/AndroidRuntime(240): at com.example.testfordatabase.MainActivity$1.onClick(MainActivity.java:34) 08-30 15:21:05.173: E/AndroidRuntime(240): at android.view.View.performClick(View.java:2408) 08-30 15:21:05.173: E/AndroidRuntime(240): at android.view.View$PerformClick.run(View.java:8816) 08-30 15:21:05.173: E/AndroidRuntime(240): at android.os.Handler.handleCallback(Handler.java:587) 08-30 15:21:05.173: E/AndroidRuntime(240): at android.os.Handler.dispatchMessage(Handler.java:92) 08-30 15:21:05.173: E/AndroidRuntime(240): at android.os.Looper.loop(Looper.java:123) 08-30 15:21:05.173: E/AndroidRuntime(240): at android.app.ActivityThread.main(ActivityThread.java:4627) 08-30 15:21:05.173: E/AndroidRuntime(240): at java.lang.reflect.Method.invokeNative(Native Method) 08-30 15:21:05.173: E/AndroidRuntime(240): at java.lang.reflect.Method.invoke(Method.java:521) 08-30 15:21:05.173: E/AndroidRuntime(240): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 08-30 15:21:05.173: E/AndroidRuntime(240): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 08-30 15:21:05.173: E/AndroidRuntime(240): at dalvik.system.NativeStart.main(Native Method) 08-30 15:21:05.173: E/AndroidRuntime(240): Caused by: java.lang.ExceptionInInitializerError 08-30 15:21:05.173: E/AndroidRuntime(240): at com.example.testfordatabase.HibernateUtility.(HibernateUtility.java:31) 08-30 15:21:05.173: E/AndroidRuntime(240): ... 13 more 08-30 15:21:05.173: E/AndroidRuntime(240): Caused by: java.lang.NoClassDefFoundError: org.hibernate.cfg.Configuration 08-30 15:21:05.173: E/AndroidRuntime(240): at com.example.testfordatabase.HibernateUtility.(HibernateUtility.java:27)

请帮忙 :D 谢谢

最佳答案

并不是所有的标准 java 类都可以在 android 上使用。其中之一是包 javax.naming - 这就是您遇到此问题的原因。不过,您可以从其他来源添加缺失的类。 (甚至撕掉它们或 rt.jar)——但这样做可能最终会复制完整的 Java 运行时。我发现 hibernate 对 android 来说有点太重量级了。

关于java - Hibernate session 工厂 Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12195262/

相关文章:

java - 如何获取正在运行的Java线程的属性?

java - 使用 JPA 和 Hibernate 时如何选择 id 生成策略

java - Spring Boot 2 依赖迁移问题

Android Widget Upgrade app..删除小部件

java - 常见unix命令(特别是dd)的java库?

java - Android ACTION_IMAGE_CAPTURE Intent 在返回应用程序之前崩溃

当使用 <include> 标签包含直接子元素的布局时,Android View 绑定(bind)问题

java - Hibernate Envers 不生成审计表

hibernate - 在应用程序关闭时删除没有后备域类的表

Java Hibernate 奇怪的编码错误?