为了创建,初始化,和调用全局的sessionFactory实例,我们使用HibernateUtil类可以将Hibernate API封装起来,减少重复代码的书写,也使得程序看起来更简洁明了
package ...
import ...
public class HibernateUtil {
private static Log log = LogFactory.getLog(HibernateUtil.class);
private static Configuration configuration;
private static SessionFactory sessionFactory;
static {
try {
configuration = new Configuration();
sessiongFactory = configuration.().configure().buildSessionFactory();
} catch(Throwable ex) {
log.error(ex.getMessage());
throw new ExceptionInInitializeError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static Configuration getConfiguration() {
return configuration;
}
public static void rebuildSessionFactory() {
Synchronized(sessiongFactory) {
try{
sessionfFactory=getConfiguration().buildSessionFactory();
} catch(Exception ex) {
log.error(ex.getMessage());
throw DatastoreException.datastoreError(ex);
}
}
}
public static void rebuildSessionFactory(Configuration cfg) {
Synchronized(sessiongFactory) {
try{
sessionfFactory= cfg.buildSessionFactory();
configuration = cfg;
} catch(Exception ex) {
log.error(ex.getMessage());
throw DatastoreException.datastoreError(ex);
}
}
}
public static void close(){
try{
sessionFactory.close();
} catch(Exception ex) {
log.error(ex.getMessage());
}
}
//下面是程序中最常用的session的打开,关闭和回滚
public static Session getSession() throws DatastoreException{
try {
return sessionFactory.openSession();
}catch(Exception ex) {
log.error(ex.getMessage());
throw DatastoreException.datastoreError(ex);
}
}
public static void closeSession(Session session) throws DatastoreException {
try{
session.close();
} catch(Exception ex){
log.error(ex.getMessage());
throw DatastoreException.datastoreError(ex);
}
}
public static void rollbackTransaction(Transaction transaction) throws DatastoreException {
try{
if(transaction != null)
transaction.rollback();
} catch(Exception ex){
log.error(ex.getMessage());
throw DatastoreException.datastoreError(ex);
}
}
}
封装后的使用的例子:
Session session = HibernateUtil.getSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
//hibernate数据库操作
Query query = session.createQuery...
tx.commit();
} catch(Exception ex) {
HibernateUtil.rollbackTransaction(ex);
throw DatastoreException.datastoreError(ex);
} finally {
HibernateUtil.closeSession(session);
}