1. 相关JAR包
hibernate3.jar
antlr.jar
asm.jar
asm-attrs.jars
cglib.jar
commons-collections.jar
commons-logging.jar
dom4j.jar
ehcache.jar
jta.jar
log4j.jar
2. 获取SessionFactory时报异常:net/sf/ehcache/CacheException
代码
Configuration configuration = new Configuration()
.addResource("com/metaarchit/bookshop/Book.hbm.xml")
.setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect")
.setProperty("hibernate.connection.driver_class", "org.hsqldb.jdbcDriver")
.setProperty("hibernate.connection.url", "jdbc:hsqldb:hsql://localhost/BookShopDB")
.setProperty("hibernate.connection.username", "sa")
.setProperty("hibernate.connection.password", "")
.setProperty("hibernate.cache.provider_class", "org.hibernate.cache.EhCacheProvider");
SessionFactory factory = configuration.buildSessionFactory();
异常:
Exception in thread "main" java.lang.NoClassDefFoundError: net/sf/ehcache/CacheException
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2328)
at java.lang.Class.getConstructor0(Class.java:2640)
at java.lang.Class.newInstance0(Class.java:321)
at java.lang.Class.newInstance(Class.java:303)
at org.hibernate.cfg.SettingsFactory.createCacheProvider(SettingsFactory.java:358)
at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:232)
at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:1933)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1216)
原因:少了ehcache.jar
3. iterate(), list()
Hibernate3 取消 2中的Session 中 find()、iterate() 方法,find()必須使用Session的createQuery()建立Query實例,並使用list()方法來取代。terate()被取消了,由Query介面上的iterator()來取代,詳請看 Query.list()、iterator()。
遇到一个很奇怪的问题,Hibernate3中iterate()属性为空
Iterator it = db().createQuery("from Book").iterate();
while (it.hasNext()) {
Object o = it.next(); //在IDEA中的调试窗口中看到的对像的属性值竞然为空(试了下hibernate2:db().iterate("from Book")却正常的),但如果强制类型转换后,System.println(((Book)o).getName());却是有值的
...
}
}
但如果是list()方法,则是正常的
List list = db().createQuery(query).list();
for (int i = 0; i < list.size(); i++) {
Object o = list.get(i);
...
}
4. 批量删除
Hibernate2:
sessionFactory.openSession().delete("from Book");
Hibernate3:
sessionFactory.createQuery("delete from Book").executeUpdate();
5. 批量更新
Hibernate2:
for (...) {
Book book = sessionFactory.openSession().load(id);
sessionFactory.openSession().delete(book);
}
Hibernate3:
sessionFactory.createQuery("update Book b set b.price = b.price + 1 where b.price < 20").executeUpdate();