package com.mossle.core.hibernate;
import java.io.Serializable;
import java.sql.Connection;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import javax.naming.NamingException;
import javax.naming.Reference;
import org.hibernate.Cache;
import org.hibernate.CustomEntityDirtinessStrategy;
import org.hibernate.EntityNameResolver;
import org.hibernate.HibernateException;
import org.hibernate.Interceptor;
import org.hibernate.MappingException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.SessionFactoryObserver;
import org.hibernate.StatelessSession;
import org.hibernate.StatelessSessionBuilder;
import org.hibernate.TypeHelper;
import org.hibernate.cache.spi.QueryCache;
import org.hibernate.cache.spi.Region;
import org.hibernate.cache.spi.UpdateTimestampsCache;
import org.hibernate.cfg.Settings;
import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
import org.hibernate.dialect.Dialect;
import org.hibernate.dialect.function.SQLFunctionRegistry;
import org.hibernate.engine.ResultSetMappingDefinition;
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
import org.hibernate.engine.jdbc.spi.JdbcServices;
import org.hibernate.engine.jdbc.spi.SqlExceptionHelper;
import org.hibernate.engine.profile.FetchProfile;
import org.hibernate.engine.query.spi.QueryPlanCache;
import org.hibernate.engine.spi.FilterDefinition;
import org.hibernate.engine.spi.NamedQueryDefinition;
import org.hibernate.engine.spi.NamedSQLQueryDefinition;
import org.hibernate.engine.spi.SessionBuilderImplementor;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.exception.spi.SQLExceptionConverter;
import org.hibernate.id.IdentifierGenerator;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
import org.hibernate.internal.NamedQueryRepository;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.metadata.CollectionMetadata;
import org.hibernate.persister.collection.CollectionPersister;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.proxy.EntityNotFoundDelegate;
import org.hibernate.service.spi.ServiceRegistryImplementor;
import org.hibernate.stat.Statistics;
import org.hibernate.stat.spi.StatisticsImplementor;
import org.hibernate.type.Type;
import org.hibernate.type.TypeResolver;
@SuppressWarnings("deprecation")
public class SessionFactoryWrapper implements SessionFactoryImplementor {
private SessionFactoryImplementor sessionFactoryImplementor;
private SpringSessionContext springSessionContext;
public SessionFactoryWrapper() {
springSessionContext = new SpringSessionContext(this);
}
public void setSessionFactory(SessionFactory sessionFactory) {
if (sessionFactory instanceof SessionFactoryImplementor) {
this.sessionFactoryImplementor = (SessionFactoryImplementor) sessionFactory;
} else {
throw new IllegalStateException("the type of sessionFactory["
+ sessionFactory + "] is not SessionFactoryImplementor");
}
}
// ~ ======================================================================
public SessionFactoryOptions getSessionFactoryOptions() {
return sessionFactoryImplementor.getSessionFactoryOptions();
}
public Session openSession() throws HibernateException {
return sessionFactoryImplementor.openSession();
}
/**
* 为了解决OpenSessionOnView注册SessionFactory引用的问题,从context中获得当前session. 之前是通过
* <code>sessionFactory.getCurrentSession()</code>直接获得
*/
public Session getCurrentSession() throws HibernateException {
return springSessionContext.currentSession();
}
public StatelessSessionBuilder withStatelessOptions() {
return sessionFactoryImplementor.withStatelessOptions();
}
public StatelessSession openStatelessSession() {
return sessionFactoryImplementor.openStatelessSession();
}
public StatelessSession openStatelessSession(Connection connection) {
return sessionFactoryImplementor.openStatelessSession(connection);
}
public ClassMetadata getClassMetadata(Class entityClass) {
return sessionFactoryImplementor.getClassMetadata(entityClass);
}
public ClassMetadata getClassMetadata(String entityName) {
return sessionFactoryImplementor.getClassMetadata(entityName);
}
public CollectionMetadata getCollectionMetadata(String roleName) {
return sessionFactoryImplementor.getCollectionMetadata(roleName);
}
public Map<String, ClassMetadata> getAllClassMetadata() {
return sessionFactoryImplementor.getAllClassMetadata();
}
public Map getAllCollectionMetadata() {
return sessionFactoryImplementor.getAllCollectionMetadata();
}
/**
* 此处需要进行封装,如果sessionFactory没有构建成功,就自己新建. 否则应该使用<code>sessionFactory.getStatistics()</code>
*/
public Statistics getStatistics() {
return new StatisticsWrapper();
}
public void close() throws HibernateException {
sessionFactoryImplementor.close();
}
public boolean isClosed() {
return sessionFactoryImplementor.isClosed();
}
public Cache getCache() {
return sessionFactoryImplementor.getCache();
}
public void evict(Class persistentClass) throws HibernateException {
throw new UnsupportedOperationException();
}
public void evict(Class persistentClass, Serializable id)
throws HibernateException {
throw new UnsupportedOperationException();
}
public void evictEntity(String entityName) throws HibernateException {
throw new UnsupportedOperationException();
}
public void evictEntity(String entityName, Serializable id)
throws HibernateException {
throw new UnsupportedOperationException();
}
public void evictCollection(String roleName) throws HibernateException {
throw new UnsupportedOperationException();
}
public void evictCollection(String roleName, Serializable id)
throws HibernateException {
throw new UnsupportedOperationException();
}
public void evictQueries(String cacheRegion) throws HibernateException {
throw new UnsupportedOperationException();
}
public void evictQueries() throws HibernateException {
throw new UnsupportedOperationException();
}
public Set getDefinedFilterNames() {
return sessionFactoryImplementor.getDefinedFilterNames();
}
public FilterDefinition getFilterDefinition(String filterName)
throws HibernateException {
return sessionFactoryImplementor.getFilterDefinition(filterName);
}
public boolean containsFetchProfileDefinition(String name) {
return sessionFactoryImplementor.containsFetchProfileDefinition(name);
}
public TypeHelper getTypeHelper() {
return sessionFactoryImplementor.getTypeHelper();
}
// ~ ======================================================================
public Reference getReference() throws NamingException {
return sessionFactoryImplementor.getReference();
}
// ~ ======================================================================
public SessionBuilderImplementor withOptions() {
return sessionFactoryImplementor.withOptions();
}
public TypeResolver getTypeResolver() {
return sessionFactoryImplementor.getTypeResolver();
}
public Properties getProperties() {
return sessionFactoryImplementor.getProperties();
}
public EntityPersister getEntityPersister(String entityName)
throws MappingException {
return sessionFactoryImplementor.getEntityPersister(entityName);
}
public Map<String, EntityPersister> getEntityPersisters() {
return sessionFactoryImplementor.getEntityPersisters();
}
public CollectionPersister getCollectionPersister(String role)
throws MappingException {
return sessionFactoryImplementor.getCollectionPersister(role);
}
public Map<String, CollectionPersister> getCollectionPersisters() {
return sessionFactoryImplementor.getCollectionPersisters();
}
public JdbcServices getJdbcServices() {
return sessionFactoryImplementor.getJdbcServices();
}
public Dialect getDialect() {
return sessionFactoryImplementor.getDialect();
}
public Interceptor getInterceptor() {
return sessionFactoryImplementor.getInterceptor();
}
public QueryPlanCache getQueryPlanCache() {
return sessionFactoryImplementor.getQueryPlanCache();
}
public Type[] getReturnTypes(String queryString) throws HibernateException {
return sessionFactoryImplementor.getReturnTypes(queryString);
}
public String[] getReturnAliases(String queryString)
throws HibernateException {
return sessionFactoryImplementor.getReturnAliases(queryString);
}
public ConnectionProvider getConnectionProvider() {
return sessionFactoryImplementor.getConnectionProvider();
}
public String[] getImplementors(String className) throws MappingException {
return sessionFactoryImplementor.getImplementors(className);
}
public String getImportedClassName(String name) {
return sessionFactoryImplementor.getImportedClassName(name);
}
public QueryCache getQueryCache() {
return sessionFactoryImplementor.getQueryCache();
}
public QueryCache getQueryCache(String regionName)
throws HibernateException {
return sessionFactoryImplementor.getQueryCache(regionName);
}
public UpdateTimestampsCache getUpdateTimestampsCache() {
return sessionFactoryImplementor.getUpdateTimestampsCache();
}
public StatisticsImplementor getStatisticsImplementor() {
return sessionFactoryImplementor.getStatisticsImplementor();
}
public NamedQueryDefinition getNamedQuery(String queryName) {
return sessionFactoryImplementor.getNamedQuery(queryName);
}
public NamedSQLQueryDefinition getNamedSQLQuery(String queryName) {
return sessionFactoryImplementor.getNamedSQLQuery(queryName);
}
public ResultSetMappingDefinition getResultSetMapping(String name) {
return sessionFactoryImplementor.getResultSetMapping(name);
}
public IdentifierGenerator getIdentifierGenerator(String rootEntityName) {
return sessionFactoryImplementor.getIdentifierGenerator(rootEntityName);
}
public Region getSecondLevelCacheRegion(String regionName) {
return sessionFactoryImplementor.getSecondLevelCacheRegion(regionName);
}
public Region getNaturalIdCacheRegion(String regionName) {
return sessionFactoryImplementor.getNaturalIdCacheRegion(regionName);
}
public Map getAllSecondLevelCacheRegions() {
return sessionFactoryImplementor.getAllSecondLevelCacheRegions();
}
public SQLExceptionConverter getSQLExceptionConverter() {
return sessionFactoryImplementor.getSQLExceptionConverter();
}
public SqlExceptionHelper getSQLExceptionHelper() {
return sessionFactoryImplementor.getSQLExceptionHelper();
}
public Settings getSettings() {
return sessionFactoryImplementor.getSettings();
}
public Session openTemporarySession() throws HibernateException {
return sessionFactoryImplementor.openTemporarySession();
}
public Set<String> getCollectionRolesByEntityParticipant(String entityName) {
return sessionFactoryImplementor
.getCollectionRolesByEntityParticipant(entityName);
}
public EntityNotFoundDelegate getEntityNotFoundDelegate() {
return sessionFactoryImplementor.getEntityNotFoundDelegate();
}
public SQLFunctionRegistry getSqlFunctionRegistry() {
return sessionFactoryImplementor.getSqlFunctionRegistry();
}
public FetchProfile getFetchProfile(String name) {
return sessionFactoryImplementor.getFetchProfile(name);
}
public ServiceRegistryImplementor getServiceRegistry() {
return sessionFactoryImplementor.getServiceRegistry();
}
public void addObserver(SessionFactoryObserver observer) {
sessionFactoryImplementor.addObserver(observer);
}
public CustomEntityDirtinessStrategy getCustomEntityDirtinessStrategy() {
return sessionFactoryImplementor.getCustomEntityDirtinessStrategy();
}
public CurrentTenantIdentifierResolver getCurrentTenantIdentifierResolver() {
return sessionFactoryImplementor.getCurrentTenantIdentifierResolver();
}
// ~ ======================================================================
public IdentifierGeneratorFactory getIdentifierGeneratorFactory() {
return sessionFactoryImplementor.getIdentifierGeneratorFactory();
}
public Type getIdentifierType(String className) throws MappingException {
return sessionFactoryImplementor.getIdentifierType(className);
}
public String getIdentifierPropertyName(String className)
throws MappingException {
return sessionFactoryImplementor.getIdentifierPropertyName(className);
}
public Type getReferencedPropertyType(String className, String propertyName)
throws MappingException {
return sessionFactoryImplementor.getReferencedPropertyType(className,
propertyName);
}
public NamedQueryRepository getNamedQueryRepository() {
return sessionFactoryImplementor.getNamedQueryRepository();
}
public Iterable<EntityNameResolver> iterateEntityNameResolvers() {
return sessionFactoryImplementor.iterateEntityNameResolvers();
}
public void registerNamedSQLQueryDefinition(String name,
NamedSQLQueryDefinition definition) {
sessionFactoryImplementor.registerNamedSQLQueryDefinition(name,
definition);
}
public void registerNamedQueryDefinition(String name,
NamedQueryDefinition definition) {
sessionFactoryImplementor
.registerNamedQueryDefinition(name, definition);
}
}