package li.hibernate;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.sql.DataSource;
import li.dao.Page;
import li.util.Reflect;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.persister.entity.SingleTableEntityPersister;
/**
* DaoSupport
*
* @author 明伟
*/
public abstract class DaoSupport {
/**
* Pojo类型
*/
private Class<?> entityClass;
/**
* Pojo名称
*/
private String entityName;
/**
* Pojo对应表名
*/
private String tableName;
/**
* Pojo ID 属性名
*/
private String idField;
/**
* Pojo 对应表的 ID 字段名
*/
private String idColumn;
/**
* sessionFactory
*/
private SessionFactory sessionFactory;
/**
* getSessionFactory
*/
public SessionFactory getSessionFactory() {
return this.sessionFactory;
}
/**
* setSessionFactory
*/
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
/**
* getOrOpenSession
*/
public Session getOrOpenSession() {
Session session = OpenSessionInViewFilter.SESSION_THREADLOCAL.get();
if (null == session) {
session = this.getSessionFactory().openSession();
}
return session;
}
/**
* closeSession
*/
public void closeSession(Session session) {
Session session_threadlocal = OpenSessionInViewFilter.SESSION_THREADLOCAL.get();
if (null != session & !session.equals(session_threadlocal)) {
session.clear();
session.close();
}
}
/**
* getDataSource
*/
public DataSource getDataSource() {
return ((li.hibernate.SessionFactory) sessionFactory).getDataSource();
}
/**
* getConnection
*/
public Connection getConnection() {
try {
return getDataSource().getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* getEntityClass
*/
public Class<?> getEntityClass() {
if (null == this.entityClass) {
this.entityClass = (Class<?>) Reflect.actualTypes(this.getClass())[0];
}
return this.entityClass;
}
/**
* setEntityClass
*/
public void setEntityClass(Class<?> entityClass) {
this.entityClass = entityClass;
}
/**
* 返回对象名
*/
public String getEntityName() {
if (null == this.entityName) {
this.entityName = this.getEntityClass().getSimpleName();
}
return this.entityName;
}
/**
* 返回表名
*/
public String getTableName() {
if (null == this.tableName) {
ClassMetadata classMetadata = this.getSessionFactory().getClassMetadata(this.getEntityClass());
this.tableName = ((SingleTableEntityPersister) classMetadata).getTableName();
}
return this.tableName;
}
/**
* 返回 Pojo ID 属性名
*/
public String getIdField() {
if (null == this.idField) {
ClassMetadata classMetadata = this.getSessionFactory().getClassMetadata(this.getEntityClass());
this.idField = classMetadata.getIdentifierPropertyName();
}
return this.idField;
}
/**
* 返回 Pojo 对应表的 ID 字段名
*/
public String getIdColumn() {
if (null == this.idColumn) {
ClassMetadata classMetadata = this.getSessionFactory().getClassMetadata(this.getEntityClass());
this.idColumn = ((SingleTableEntityPersister) classMetadata).getIdentifierColumnNames()[0];
}
return this.idColumn;
}
/**
* buildQuery
*
* @param session 为空时使用 getCurrentSession()
* @param page 为空时不分页
* @param hql
* @param args 替换?的参数数组
*/
protected Query buildQuery(Session session, Page page, String hql, Object... args) {
return setArgs(page, (null == session ? this.getSessionFactory().openSession() : session).createQuery(hql), args);
}
/**
* buildSqlQuery
*
* @param session 为空时使用 getCurrentSession()
* @param page 为空时不分页
* @param sql
* @param args 替换?的参数数组
*/
protected SQLQuery buildSqlQuery(Session session, Page page, String sql, Object... args) {
return setArgs(page, (null == session ? this.getSessionFactory().openSession() : session).createSQLQuery(sql), args);
}
/**
* setArgs #cannot define positional parameter after any named parameters have been defined
*
* @param page null for no page
* @param query hql
* @param args map or not map
*/
private <Q extends Query> Q setArgs(Page page, Q query, Object... args) {
if (null != args) {
int mapArgNum = 0;
for (int i = 0; i < args.length; i++) {
if (args[i] instanceof Map) {
query = (Q) this.setArgMap(query, (Map<String, Object>) args[i]);
mapArgNum++;
} else {
query.setParameter(i - mapArgNum, args[i]);
}
}
}
if (null != page) {
query.setFirstResult(page.getFrom());
query.setMaxResults(page.getPageSize());
}
return query;
}
/**
* setArgMap
*
* @param query
* @param args
*/
private <Q extends Query> Q setArgMap(Q query, Map<String, Object> args) {
Set<Entry<String, Object>> argsSet = args.entrySet();
for (Entry<String, Object> arg : argsSet) {
query.setParameter(arg.getKey(), arg.getValue());
}
return query;
}
}