📄 statelesssessionimpl.java
字号:
//$Id: StatelessSessionImpl.java 11398 2007-04-10 14:54:07Z steve.ebersole@jboss.com $package org.hibernate.impl;import java.io.Serializable;import java.sql.Connection;import java.util.Collections;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.hibernate.CacheMode;import org.hibernate.ConnectionReleaseMode;import org.hibernate.Criteria;import org.hibernate.EmptyInterceptor;import org.hibernate.EntityMode;import org.hibernate.FlushMode;import org.hibernate.HibernateException;import org.hibernate.Interceptor;import org.hibernate.LockMode;import org.hibernate.MappingException;import org.hibernate.ScrollMode;import org.hibernate.ScrollableResults;import org.hibernate.SessionException;import org.hibernate.StatelessSession;import org.hibernate.Transaction;import org.hibernate.UnresolvableObjectException;import org.hibernate.cache.CacheKey;import org.hibernate.collection.PersistentCollection;import org.hibernate.engine.EntityKey;import org.hibernate.engine.PersistenceContext;import org.hibernate.engine.QueryParameters;import org.hibernate.engine.StatefulPersistenceContext;import org.hibernate.engine.Versioning;import org.hibernate.engine.query.HQLQueryPlan;import org.hibernate.engine.query.NativeSQLQueryPlan;import org.hibernate.engine.query.sql.NativeSQLQuerySpecification;import org.hibernate.event.EventListeners;import org.hibernate.id.IdentifierGeneratorFactory;import org.hibernate.jdbc.Batcher;import org.hibernate.jdbc.JDBCContext;import org.hibernate.loader.criteria.CriteriaLoader;import org.hibernate.loader.custom.CustomLoader;import org.hibernate.loader.custom.CustomQuery;import org.hibernate.persister.entity.EntityPersister;import org.hibernate.persister.entity.OuterJoinLoadable;import org.hibernate.pretty.MessageHelper;import org.hibernate.proxy.HibernateProxy;import org.hibernate.type.Type;import org.hibernate.util.CollectionHelper;/** * @author Gavin King */public class StatelessSessionImpl extends AbstractSessionImpl implements JDBCContext.Context, StatelessSession { private static final Logger log = LoggerFactory.getLogger( StatelessSessionImpl.class ); private JDBCContext jdbcContext; private PersistenceContext temporaryPersistenceContext = new StatefulPersistenceContext( this ); StatelessSessionImpl(Connection connection, SessionFactoryImpl factory) { super( factory ); this.jdbcContext = new JDBCContext( this, connection, EmptyInterceptor.INSTANCE ); } // inserts ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public Serializable insert(Object entity) { errorIfClosed(); return insert(null, entity); } public Serializable insert(String entityName, Object entity) { errorIfClosed(); EntityPersister persister = getEntityPersister(entityName, entity); Serializable id = persister.getIdentifierGenerator().generate(this, entity); Object[] state = persister.getPropertyValues(entity, EntityMode.POJO); if ( persister.isVersioned() ) { boolean substitute = Versioning.seedVersion(state, persister.getVersionProperty(), persister.getVersionType(), this); if ( substitute ) { persister.setPropertyValues( entity, state, EntityMode.POJO ); } } if ( id == IdentifierGeneratorFactory.POST_INSERT_INDICATOR ) { id = persister.insert(state, entity, this); } else { persister.insert(id, state, entity, this); } persister.setIdentifier(entity, id, EntityMode.POJO); return id; } // deletes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public void delete(Object entity) { errorIfClosed(); delete(null, entity); } public void delete(String entityName, Object entity) { errorIfClosed(); EntityPersister persister = getEntityPersister(entityName, entity); Serializable id = persister.getIdentifier(entity, EntityMode.POJO); Object version = persister.getVersion(entity, EntityMode.POJO); persister.delete(id, version, entity, this); } // updates ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public void update(Object entity) { errorIfClosed(); update(null, entity); } public void update(String entityName, Object entity) { errorIfClosed(); EntityPersister persister = getEntityPersister(entityName, entity); Serializable id = persister.getIdentifier(entity, EntityMode.POJO); Object[] state = persister.getPropertyValues(entity, EntityMode.POJO); Object oldVersion; if ( persister.isVersioned() ) { oldVersion = persister.getVersion(entity, EntityMode.POJO); Object newVersion = Versioning.increment( oldVersion, persister.getVersionType(), this ); Versioning.setVersion(state, newVersion, persister); persister.setPropertyValues(entity, state, EntityMode.POJO); } else { oldVersion = null; } persister.update(id, state, null, false, null, oldVersion, entity, null, this); } // loading ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ public Object get(Class entityClass, Serializable id) { return get( entityClass.getName(), id ); } public Object get(Class entityClass, Serializable id, LockMode lockMode) { return get( entityClass.getName(), id, lockMode ); } public Object get(String entityName, Serializable id) { return get(entityName, id, LockMode.NONE); } public Object get(String entityName, Serializable id, LockMode lockMode) { errorIfClosed(); Object result = getFactory().getEntityPersister(entityName) .load(id, null, lockMode, this); temporaryPersistenceContext.clear(); return result; } public void refresh(Object entity) { refresh( bestGuessEntityName( entity ), entity, LockMode.NONE ); } public void refresh(String entityName, Object entity) { refresh( entityName, entity, LockMode.NONE ); } public void refresh(Object entity, LockMode lockMode) { refresh( bestGuessEntityName( entity ), entity, lockMode ); } public void refresh(String entityName, Object entity, LockMode lockMode) { final EntityPersister persister = this.getEntityPersister( entityName, entity ); final Serializable id = persister.getIdentifier( entity, getEntityMode() ); if ( log.isTraceEnabled() ) { log.trace( "refreshing transient " + MessageHelper.infoString( persister, id, this.getFactory() ) ); } // TODO : can this ever happen???// EntityKey key = new EntityKey( id, persister, source.getEntityMode() );// if ( source.getPersistenceContext().getEntry( key ) != null ) {// throw new PersistentObjectException(// "attempted to refresh transient instance when persistent " +// "instance was already associated with the Session: " +// MessageHelper.infoString( persister, id, source.getFactory() )// );// } if ( persister.hasCache() ) { final CacheKey ck = new CacheKey( id, persister.getIdentifierType(), persister.getRootEntityName(), this.getEntityMode(), this.getFactory() ); persister.getCacheAccessStrategy().evict( ck ); } String previousFetchProfile = this.getFetchProfile(); Object result = null; try { this.setFetchProfile( "refresh" ); result = persister.load( id, entity, lockMode, this ); } finally { this.setFetchProfile( previousFetchProfile ); } UnresolvableObjectException.throwIfNull( result, id, persister.getEntityName() ); } public Object immediateLoad(String entityName, Serializable id) throws HibernateException { throw new SessionException("proxies cannot be fetched by a stateless session"); } public void initializeCollection( PersistentCollection collection, boolean writing) throws HibernateException { throw new SessionException("collections cannot be fetched by a stateless session"); } public Object instantiate( String entityName, Serializable id) throws HibernateException { errorIfClosed(); return getFactory().getEntityPersister( entityName ) .instantiate( id, EntityMode.POJO ); } public Object internalLoad( String entityName, Serializable id, boolean eager, boolean nullable) throws HibernateException { errorIfClosed(); EntityPersister persister = getFactory().getEntityPersister(entityName); if ( !eager && persister.hasProxy() ) { return persister.createProxy(id, this); } Object loaded = temporaryPersistenceContext.getEntity( new EntityKey(id, persister, EntityMode.POJO) ); //TODO: if not loaded, throw an exception return loaded==null ? get( entityName, id ) : loaded; } public Iterator iterate(String query, QueryParameters queryParameters) throws HibernateException { throw new UnsupportedOperationException(); } public Iterator iterateFilter(Object collection, String filter, QueryParameters queryParameters) throws HibernateException { throw new UnsupportedOperationException(); } public List listFilter(Object collection, String filter, QueryParameters queryParameters) throws HibernateException { throw new UnsupportedOperationException(); } public boolean isOpen() { return !isClosed(); } public void close() { managedClose(); } public ConnectionReleaseMode getConnectionReleaseMode() { return factory.getSettings().getConnectionReleaseMode(); } public boolean isAutoCloseSessionEnabled() { return factory.getSettings().isAutoCloseSessionEnabled(); } public boolean isFlushBeforeCompletionEnabled() { return true; } public boolean isFlushModeNever() { return false; } public void managedClose() { if ( isClosed() ) { throw new SessionException( "Session was already closed!" ); } jdbcContext.getConnectionManager().close(); setClosed(); } public void managedFlush() { errorIfClosed(); getBatcher().executeBatch(); } public boolean shouldAutoClose() { return isAutoCloseSessionEnabled() && !isClosed(); } public void afterTransactionCompletion(boolean successful, Transaction tx) {} public void beforeTransactionCompletion(Transaction tx) {} public String bestGuessEntityName(Object object) { if (object instanceof HibernateProxy) { object = ( (HibernateProxy) object ).getHibernateLazyInitializer().getImplementation(); } return guessEntityName(object);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -