- hibernate的lib目录所有的jar要是都copy到project的WEB-INF/lib中肯定没什么问题,但是我就不是很喜欢这样做,因此总结jar作用如下:
- * dom4j(必需):Hibernate在解析XML配置和XML映射元文件時需要使用dom4j。
* CGLIB(必需):Hibernate在運行時使用這個代碼生成庫強化類(與Java反射機制聯合使用)。
* Commons Collections, Commons Logging(必需):Hibernat使用Apache Jakarta Commons項目提供的多個工具類庫。
* ODMG4(必需):Hibernate提供了一個可選的ODMG兼容持久化管理界面。如果你需要映射集合,你就需要這個類庫,就算你不是為了使用ODMG API。
* EHCache(必需):Hibernate可以使用不同的第二級Cache方案。如果沒有修改配置的話,EHCache提供默認的Cache。
jta.jar(必需):若你在使用hibernate要到Transaction则要使用这个jar包,建议使用Transaction
- struts怎么样通过hibernate链接数据库
我使用的是插件的方式:在struts-config.xml文件中加入:
<plug-in className="packagename.ConfigurableProjPlugin"/>
ConfigurableProjPlugin类的代码如下:
##################################
package name;
import javax.servlet.ServletException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.action.PlugIn;
import org.apache.struts.config.ModuleConfig;
import org.hibernate.Session;
/**
* @author sermonizer
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class ConfigurableProjPlugin implements PlugIn {
private static Log logger = LogFactory.getLog(ConfigurableProjPlugin.class);
public void destroy() {
HibernateUtil.closeSession();
logger.info("db connection is destoryed !!!");
}
public void init(ActionServlet arg0, ModuleConfig arg1) throws ServletException {
Session session = HibernateUtil.currentSession();
logger.info("db connection is created successfull !!!");
}
}
##################################
其中涉及到HibernateUtil类,代码如下:
##################################
package name;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (HibernateException ex) {
throw new RuntimeException("Exception building SessionFactory: " + ex.getMessage(), ex);
}
}
public static final ThreadLocal session = new ThreadLocal();
public static Session currentSession() throws HibernateException {
Session s = (Session) session.get();
// Open a new Session, if this Thread has none yet
if (s == null) {
s = sessionFactory.openSession();
session.set(s);
}
return s;
}
public static void closeSession() throws HibernateException {
Session s = (Session) session.get();
session.set(null);
if (s != null)
s.close();
}
}
##################################
用hibernate tools生成xml文件的一些bug说明:
这样strut在loader的时候就会通过hibernate链接数据库了,当然hibernate-cfg.xml文件不能少的
这里值得注意的是:用hibernate tools生成的mapping文件很有问题,它会在
1.<class name="tableclass" table="tablename" catalog="×××">加上catalog内容,导致hibernate运行时按照一下顺序找table :dbname.×××.table。这样老是找不到导致Exception。
2.它不会在hbm.xml文件里的 <hibernate-mapping>中加入auto-import="true",从而导致HQL不能正常的使用。因为所有的SQL语句的From对象均是来自×××.hbm.xml的class name值。
3.对于我在数据库设计时就规定该field为auto_increment,但是用tool生成的描述文件就硬生生的写着<generator class="assigned" />,这样但是在save的时候老是要set这个field的值,因此应该改成<generator class="increment" />才能让数据库自动去产生这个field值
但是现在我仍旧没有找到什么好的方法,by the way,hibernate tool不能同步数据库表修改mapping文件,但是hibernate synchronizer工具又不能很好的支持hibernate3,唉!