zoukankan      html  css  js  c++  java
  • hibernate 使用过程中遇到的问题

    一、java.lang.ClassNotFoundException: javassist.util.proxy.MethodFilter

     log4j:WARN No appenders could be found for logger (org.hibernate.type.BasicTypeRegistry).
    log4j:WARN Please initialize the log4j system properly.
    Exception in thread "main" org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]
     at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:108)
     at org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:133)
     at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.java:80)
     at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:322)
     at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:485)
     at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:133)
     at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:84)
     at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:286)
     at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1845)
     at junit.test.testadd(test.java:14)
     at junit.test.main(test.java:25)
    Caused by: java.lang.reflect.InvocationTargetException
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
     at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
     at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:105)
     ... 10 more
    Caused by: java.lang.NoClassDefFoundError: javassist/util/proxy/MethodFilter
     at org.hibernate.bytecode.javassist.BytecodeProviderImpl.getProxyFactoryFactory(BytecodeProviderImpl.java:49)
     at org.hibernate.tuple.entity.PojoEntityTuplizer.buildProxyFactoryInternal(PojoEntityTuplizer.java:205)
     at org.hibernate.tuple.entity.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.java:183)
     at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:167)
     at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:77)
     ... 15 more
    Caused by: java.lang.ClassNotFoundException: javassist.util.proxy.MethodFilter
     at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
     at java.security.AccessController.doPrivileged(Native Method)
     at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
     at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
     ... 20 more

    用junit4测试报的错:

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'groupdao' defined in class path resource [applicationContext.xml]..................

    nested exception is org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]

    这个错误的解决办法是 添加 hibernate required 包javassist-3.12.0.GA.jar ,建议把hibernate required 所有包都导入到项目中

    第二个问题 是不显示 sql 语句

    在hibernate.cfg.xml 里面加上

    <property name="hibernate.show_sql">true</property>  就能显示 sql  ,这能 帮助你学习hibernate

    第三个问题

    Exception in thread "main" org.hibernate.TypeMismatchException: Provided id of the wrong type for class model.User. Expected: class java.lang.Integer, got class java.lang.String
     at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:135)
     at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:1090)
     at org.hibernate.impl.SessionImpl.get(SessionImpl.java:1005)
     at org.hibernate.impl.SessionImpl.get(SessionImpl.java:998)
     at junit.test.testadd(test.java:20)
     at junit.test.main(test.java:25)

    问题解决办法是 检查下

    User user =(User)session.get(User.class, "1");

    应该改成

    User user =(User)session.get(User.class, 1 ); 因为 主键 是整形的

     注意 这里 有个 type 类型  使用get 方法 ,要和id 类型一致。

    <id name="myid" column="id" type="java.lang.Integer" >
       <generator class="native"/>
      </id>

    二、java.lang.NoClassDefFoundError: Could not initialize class util.HibernateUtil

    java.lang.NoClassDefFoundError: Could not initialize class util.HibernateUtil

    后来发现是因为添加了Hibernate的annotation的三个包的问题,将以下三个包去掉,则可以:

    ejb3-persistence.jar

    hibernate-annotations.jar

    hibernate-commos-annotation.jar

    三、Hibernate中HibernateUtil

    Configuration cfg=new Configuration();
    cfg.configure();
    SessionFactory sf=cfg.buildSessionFactory();
    这些代码是非常耗时的,我们希望它只做一次,一般我们希望它只做一次,我们去做一个工具类去初始化hibernate。工具类一般不希望被继承,别人来改写我的东西,一般用finally.

    package net.cnlib.util;

    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;

    public final class HibernateUtil {
     private static SessionFactory sessionFactory=null;
     private HibernateUtil() {
     }

     static {
      Configuration cfg = new Configuration();
      cfg.configure();
      sessionFactory = cfg.buildSessionFactory();
     }

     public static SessionFactory getSessionFactory() {
      return sessionFactory;
     }

     public static Session getSession(){
      return  sessionFactory.openSession();
     }
     
    }

     cfg.configure()这句话就会去读hibernate.cfg.xml里面的配置文件.如果你的配置文件不叫hibernate,cfg.xml,你就要用cfg.configure("filename")来指定你需要的配置文件。我们可以查看源代码。在使用cfg.configure()时:

     public Configuration configure() throws HibernateException {
      configure( "/hibernate.cfg.xml" );
      return this;
     }

    会把hibernate.cfg.xml传进去,eclipse会在哪里去找这个hibernate.cfg.xml这个文件呢?会在classpath中去找这个文件。src这个目录不是classpath,但是它为什么可以找的到呢?因为scr目录最终都会编译到classpath中去。session就类似与jdbc的connection.

    Hibernate 中先对来说比较规范的一个添加一个对象的写法

     static void addPerson(Person person) {
      Session session = null;
      Transaction tx = null;
      try {
       session = HibernateUtil.getSession();
       tx = session.beginTransaction();
       session.save(person);

      } catch (HibernateException e) {
       if (tx != null)
        tx.rollback();
       throw e;  //这个时候最好是把异常抛出去,因为如果只是回滚的话,就没有任何提示给调用者。
      } finally {
       session.close();
      }
     }

    题外话:发现有错误时,应习惯性去服务器里自己部署的项目下查看lib里是否有所需要的jar包

    四、org.hibernate.MappingException: Unknown entity:

    许多初学者在学习Hibernate的时候,总会遇到这样的问题。org.hibernate.MappingException: Unknown entity: ******

    今天我在调试程序的时候也遇到了此问题,最终终于解决,下面我的一些总结下。

    一句话:“因为你的映射文件(*.hbm.xml) 没有被映射”

    问题出现的原因,有几下几点:

    1,检查你的映射文件的名字是否和你的pojo(*.java)的名字是否相同。

    2.映射文件的名字是*.hbm.xml而不是*.xml

    3.你是否加载了你的映射文件。

          加载的方法有两种

       (1)在你的Hibernate.cfg.xml配置文件中加载映射文件

    <?xml version='1.0' encoding='UTF-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
              "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

    <!-- Generated by MyEclipse Hibernate Tools.                   -->
    <hibernate-configuration>

                  …………

                  …………

             <!-- 用于记载映射文件Student.hbm.xml-->
         <mapping resource="com/Students.hbm.xml"/>
         </session-factory>

    </hibernate-configuration>

        (2)在你的测试代码的加载映射文件

               Configuration cfg = new Configuration();
               cfg.configure();
               cfg.addClass(*.class);    这里的*.class是你的映射文件的名字*.hbm.class中的*。。。

          但是你要注意,用第二种方法加载的时候,你的*.hbm.class文件必须位于classpath下面。

  • 相关阅读:
    读Android之大话设计模式--前言和说明
    把二叉树打印成多行
    按之字形顺序打印二叉树
    对称的二叉树
    二叉树的下一个结点
    链表中环的入口结点
    字符流中第一个不重复的字符
    表示数值的字符串
    构建乘积数组
    数组中重复的数字
  • 原文地址:https://www.cnblogs.com/swxj/p/3118786.html
Copyright © 2011-2022 走看看