承蒙CSDN里各位大哥大姐的照顾和指导,小弟学习Hibernate有一段时间了,以前都是用Hibernate的自动生成工具,生成Hibernate的配置文件和映射文件,甚至实体类,但我觉得初学阶段不应该使用这种工具,再说初学的项目一般都比较简单,用手一个个敲出来问题不大我想,所以我想问一个问题,Hibernate里的HibernateSessionFactory和BaseHibernateDao怎么用手敲出来,HibernateSessionFactory是不是一定要自动生成,有没有可能用一个类代替这两个类的功能?就问这么多,嘻嘻!麻烦各位啦!在此贴出我以前写的BaseHibernateDao类(整个项目就用这个类,我没写HibernateSessionFactory):
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;public class BaseHibernateDao {
protected static Session session;
protected static Transaction tx;
protected static boolean isSuccessful; protected Session getSession() {
return session = new Configuration().configure().buildSessionFactory()
.openSession();
}
protected void setSession(Session session){
BaseHibernateDao.session=session;
}
protected void closeSession(Session session){
if(session!=null)
session.close();
session=null;
}
protected boolean add(Object obj){
try{
session=getSession();
tx=session.beginTransaction();
session.save(obj);
isSuccessful=true;
tx.commit();
}catch(RuntimeException e){
e.printStackTrace();
isSuccessful=false;
tx.rollback();
}finally{
closeSession(session);
}
return isSuccessful;
}
protected boolean delete(Object obj){
try{
session=getSession();
tx=session.beginTransaction();
session.delete(obj);
isSuccessful=true;
tx.commit();
}catch(RuntimeException e){
e.printStackTrace();
isSuccessful=false;
tx.rollback();
}finally{
closeSession(session);
}
return isSuccessful;
}
protected boolean update(Object obj){
try{
session=getSession();
tx=session.beginTransaction();
session.update(obj);
isSuccessful=true;
tx.commit();
}catch(RuntimeException e){
e.printStackTrace();
isSuccessful=false;
tx.rollback();
}finally{
closeSession(session);
}
return isSuccessful;
}
protected Object get(Class clz,Serializable sid){
Object obj=null;
try{
session=getSession();
obj=session.get(clz, sid);
}catch(RuntimeException e){
e.printStackTrace();
}finally{
closeSession(session);
}
return obj;
}
}我觉得这样写是由问题的,CSDN里一个大哥也跟我说过,但我不知道具体该怎么写。

解决方案 »

  1.   

    这个类可以不写的 到时候交给Spring的HibernateDao去处理也一样,Spring封装了的
      

  2.   


    package best.web.hibernate.dao;import java.io.Serializable;
    import java.sql.SQLException;
    import java.util.Collection;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;import org.hibernate.HibernateException;
    import org.hibernate.Query;
    import org.hibernate.SQLQuery;
    import org.hibernate.Session;
    import org.hibernate.transform.Transformers;
    import org.springframework.orm.hibernate3.HibernateCallback;
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;public class HibernateDaoImpl extends HibernateDaoSupport implements
    HibernateDao {

    private static String FROM = "from ";
    private static String ORDER= " order by "; public Collection find(String hql) {
    return this.getHibernateTemplate().find(hql);
    } public Collection find(String hql, Object[] parameter) {
    return this.getHibernateTemplate().find(hql, parameter);
    } public Collection getObjectAll(Class c) {
    return this.getHibernateTemplate().find(new StringBuilder(FROM).append(c.getName()).toString());
    }

    public Collection getObjectAllOrderBy(Class c,String oderName){
    return this.getHibernateTemplate().find(new StringBuilder(FROM).append(c.getName()).append(ORDER).append(oderName).toString());
    } public Object getObjectById(Class c, Serializable id) {
    return this.getHibernateTemplate().get(c, id);
    } public void remove(Object obj) {
    this.getHibernateTemplate().delete(obj);
    } public void removeAll(Collection list) {
    this.getHibernateTemplate().deleteAll(list);
    } public void saveOrUpdate(Object obj) {
    this.getHibernateTemplate().saveOrUpdate(obj);
    } public void saveOrUpdateAll(Collection list) {
    this.getHibernateTemplate().saveOrUpdateAll(list);
    } public Collection findByNamedParam(String hql, String hName, Object[] parameter) {
    return this.getHibernateTemplate().findByNamedParam(hql, hName, parameter);
    } public void execute(final String hql, final Object[] parameter) {
    getHibernateTemplate().execute(new HibernateCallback(){
    public Object doInHibernate(Session session) throws HibernateException, SQLException {
    Query query = session.createQuery(hql);
    for(int i=0 ;i<parameter.length ;i++){
    query.setParameter(i, parameter[i]);
    }
    return query.executeUpdate();
    }});
    } public List findCreateSql(final String sql,final Map parameter,final Map retClass) {
    List list = getHibernateTemplate().executeFind(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException {

    SQLQuery query = session.createSQLQuery(sql);
    query.setProperties(parameter);
    Iterator it = retClass.entrySet().iterator();
    while(it.hasNext()){
    String keyAs = (String) it.next();
    query.addEntity(keyAs, (Class)retClass.get(keyAs));
    }
    return query.list();
    }});
    return list;
    } public List findCreateSql(final String sql, final Map retClass) {
    List list = getHibernateTemplate().executeFind(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException {
    SQLQuery query = session.createSQLQuery(sql);
    Iterator it = retClass.entrySet().iterator();
    while(it.hasNext()){
    String keyAs = (String) it.next();
    query.addEntity(keyAs, (Class)retClass.get(keyAs));
    }
    return query.list();
    }});
    return list;
    } @SuppressWarnings("unchecked")
    public List<Map> findCreateSqlMap(final String sql) {
    List<Map> list = getHibernateTemplate().executeFind(new HibernateCallback(){
    public Object doInHibernate(Session session) throws HibernateException, SQLException {
    SQLQuery query = session.createSQLQuery(sql);
    query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
    return (List<Map>)query.list();
    }});
    return list;
    }

    @SuppressWarnings("unchecked")
    public List<Map> findCreateSqlMap(final String sql,final Object[] parameter) {
    List<Map> list = getHibernateTemplate().executeFind(new HibernateCallback(){
    public Object doInHibernate(Session session) throws HibernateException, SQLException {
    SQLQuery query = session.createSQLQuery(sql);
    for(int i=0;i<parameter.length;i++){
    query.setParameter(i, parameter[i]);
    }
    query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
    return (List<Map>)query.list();

    }});
    return list;
    }

    @SuppressWarnings("unchecked")
    public List findCreateSqlMap(final String sql,final Map parameter) {
     
    List<Map> list = getHibernateTemplate().executeFind(new HibernateCallback(){
    public Object doInHibernate(Session session) throws HibernateException, SQLException {
    SQLQuery query = session.createSQLQuery(sql);
    query.setProperties(parameter).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
    return (List<Map>)query.list();
    }});
    return list;
    }
    }spring封装hibernate我们就用一个dao,一般都够!不够在扩展·
      

  3.   

    顶 如果和Spring一起开发的话,还是自动生成较省事
      

  4.   

    谢谢大家,spring暂时还没接触到,但我会学的,谢谢你们特别是:xiaomaha,代码我收藏了,3Q!