lee79 发表于 2013-1-14 23:46:53

Hibernate3环境

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();
页: [1]
查看完整版本: Hibernate3环境