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下面。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM