最近準備學(xué)習hibernate。于是就在網(wǎng)絡(luò )上搜索有關(guān)的文章。還好上面的資料還算豐富。于是就照葫蘆畫(huà)瓢了,擇抄了一個(gè)網(wǎng)友的代碼??墒窃谖业沫h(huán)境中編譯卻老是出錯。讓我好是郁悶??!幸好經(jīng)過(guò)查資料,一步步地走出重圍。終于跑了起來(lái)。
原始的代碼:
| java代碼: |
package com.javamodel.hibernate; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import net.sf.hibernate.HibernateException; import net.sf.hibernate.MappingException; import net.sf.hibernate.Session; import net.sf.hibernate.SessionFactory; import net.sf.hibernate.Transaction; import net.sf.hibernate.cfg.Configuration; public class Example{ private static SessionFactory _sessions = null; private static Properties pops = new Properties(); static{ try { InputStream stream = Example.class.getResourceAsStream("hibernate.properties"); try { pops.load(stream); } catch (IOException e1) { e1.printStackTrace(); } Configuration cfg = new Configuration(); cfg.addClass(Person.class); cfg.setProperties(pops); _sessions = cfg.buildSessionFactory(); } catch (MappingException e) { e.printStackTrace(); } catch (HibernateException e) { e.printStackTrace(); } } public static void main(String[] args) throws HibernateException { Person person = new Person(); person.setName("smallduzi"); person.setEmail("smallduzi@sohu.com"); Session session = _sessions.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); session.save(person); tx.commit(); }catch(HibernateException he){ if(tx != null) tx.rollback(); throw he; } finally{ session.close(); } } } |
Person.java
| java代碼: |
package com.javamodel.hibernate; public class Person { private String id = null; private String name = null; private String email = null; public Person(){} /** * @return */ public String getEmail() { return email; } /** * @return */ public String getId() { return id; } /** * @return */ public String getName() { return name; } /** * @param string */ public void setEmail(String string) { email = string; } /** * @param string */ public void setId(String string) { id = string; } /** * @param string */ public void setName(String string) { name = string; } } |
Person.hbm.xml
| java代碼: |
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" > <hibernate-mapping> <class name="com.javamodel.hibernate.Person" table="person"> <id name="id"> <column name="id" length="40"/> <generator class="uuid.hex"/> </id> <property name="name" column="name" /> <property name="email" column="email" /> </class> </hibernate-mapping> |
hibernate.properties
| java代碼: |
## Oracle hibernate.dialect net.sf.hibernate.dialect.OracleDialect hibernate.connection.driver_class oracle.jdbc.driver.OracleDriver hibernate.connection.username XXX hibernate.connection.password XXX #hibernate.connection.url jdbc:oracle:thin:@192.168.0.28:1521:orcl hibernate.connection.url jdbc:oracle:oci8:@XXX |
-------------------------------------------
因為我這里使用的是mysql。我就重新編輯了一下數據庫連接的參數配置:
## MySQL
hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
hibernate.connection.driver_class com.mysql.jdbc.Driver
hibernate.connection.url jdbc:mysql://172.16.232.118/hibernate_test
hibernate.connection.username root
hibernate.connection.password pass
但是我剛開(kāi)始的在eclipse執行的時(shí)候居然提示沒(méi)有net.sf這個(gè)包。怎么搞的,我明明是在網(wǎng)絡(luò )山下載的最新的hibernate3.0.5的jar包啊。前思后想,不得要領(lǐng)。郁悶的要吐血。
后來(lái)我在網(wǎng)絡(luò )上看到他們開(kāi)發(fā)的東西都是使用的hibernate2的包。只得重新下載了。(提示:我發(fā)現在3.0的包里面package的名字都已經(jīng)變了。原來(lái)的net.sf.hibernate --> org.hibernate。好混啊,不知道怎么會(huì )有這么大的變化,可是害苦了,我們這些初學(xué)的人)。
最后編譯,卻出現了一個(gè)又一個(gè)的問(wèn)題。
最初出現的問(wèn)題是提示:Person.hbm.xml文件找不到,狂暈啊。我不是已經(jīng)把他放在class文件在一起的嗎?有折磨了好久得時(shí)間。我用style studio xml工具,仔細檢查了這個(gè)文件,好好的。顯示也完全正常??蛇€是提示找不到。嗎的。無(wú)疑之間,我用editorplus打開(kāi)這個(gè)文件,居然發(fā)現里面有亂碼存在???,去掉那些非法的字符。終于不在提示這個(gè)錯誤了。但是新的問(wèn)題又出現了。
問(wèn)題:
Exception in thread "main" net.sf.hibernate.HibernateException: could not instantiate CacheProvider: org.hibernate.cache.HashtableCacheProvider
at net.sf.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:134)
at net.sf.hibernate.cfg.Configuration.buildSettings(Configuration.java:1155)
at net.sf.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:789)
at testhibernate.Client2.main(Client2.java:24)
Caused by: java.lang.ClassNotFoundException: org.hibernate.cache.HashtableCacheProvider
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:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:164)
at net.sf.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:102)
at net.sf.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:131)
... 3 more 找到問(wèn)題的所在了。
修改一下hibernate.properties文件
修改前:
## choose a cache implementation
#hibernate.cache.provider_class org.hibernate.cache.EhCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.EmptyCacheProvider
hibernate.cache.provider_class org.hibernate.cache.HashtableCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.TreeCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.OSCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.SwarmCacheProvider
修改后:
## choose a cache implementation
#hibernate.cache.provider_class org.hibernate.cache.EhCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.EmptyCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.HashtableCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.TreeCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.OSCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.SwarmCacheProvider小結:
經(jīng)過(guò)一番的周折,總算把第一個(gè)例子跑起來(lái)了?,F在回頭想想,感慨頗多啊。
首先要注意的是,在網(wǎng)絡(luò )上找到例子要看清楚他們運行的環(huán)境和要求。這樣就不會(huì )出現驢唇不對馬嘴的情況;
其次,從網(wǎng)絡(luò )上copy代碼的時(shí)候要仔細檢查代碼是否有錯誤。最好就是用比較專(zhuān)業(yè)的ide或編輯器。主要是由于一些網(wǎng)站上對代碼的
處理有錯誤。
Exception in thread "main" net.sf.hibernate.HibernateException: could not instantiate CacheProvider: org.hibernate.cache.HashtableCacheProvider
at net.sf.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:134)
at net.sf.hibernate.cfg.Configuration.buildSettings(Configuration.java:1155)
at net.sf.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:789)
at testhibernate.Client2.main(Client2.java:24)
Caused by: java.lang.ClassNotFoundException: org.hibernate.cache.HashtableCacheProvider
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:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:164)
at net.sf.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:102)
at net.sf.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:131)
... 3 more
找到問(wèn)題的所在了。
修改一下hibernate.properties文件
修改前:
## choose a cache implementation
#hibernate.cache.provider_class org.hibernate.cache.EhCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.EmptyCacheProvider
hibernate.cache.provider_class org.hibernate.cache.HashtableCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.TreeCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.OSCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.SwarmCacheProvider
修改后:
## choose a cache implementation
#hibernate.cache.provider_class org.hibernate.cache.EhCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.EmptyCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.HashtableCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.TreeCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.OSCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.SwarmCacheProvider小結:經(jīng)過(guò)一番的周折,總算把第一個(gè)例子跑起來(lái)了?,F在回頭想想,感慨頗多啊。首先要注意的是,在網(wǎng)絡(luò )上找到例子要看清楚他們運行的環(huán)境和要求。這樣就不會(huì )出現驢唇不對馬嘴的情況;其次,從網(wǎng)絡(luò )上copy代碼的時(shí)候要仔細檢查代碼是否有錯誤。最好就是用比較專(zhuān)業(yè)的ide或編輯器。主要是由于一些網(wǎng)站上對代碼的處理有錯誤。
聯(lián)系客服