hibernate session接口

news2024/11/24 3:58:59

hibernate session接口

Session接口是hibernate向应用程序提供的操纵数据库的最主要的接口,提供了保存、更新、删除和加载Java对象的方法。

session具有一个缓存,位于缓存中的对象成为持久化对象,和数据库中的相关记录对应。session能够在某些时间点,按照缓存中对象的变化来执行相关的SQL语句,来同步更新数据库,这一过程称为刷新缓存(flush)。

hibernate把对象分为4种状态,持久化状态,临时状态,游离状态,删除状态。session的特定方法可以使对象进行状态转换

session缓存

session实例没有结束生命周期,且没有清理缓存,则存放在session缓存中的对象也不会结束生命周期,session缓存可以减少访问数据库的频率。

操作session缓存
flush方法

缓存中对象同步到数据库(会插入或更新数据库),使数据库中的状态与缓存中一致

注意:

session在以下情况下会刷新缓存

  • hibernate在事务提交之前会执行flush()方法,然后再向数据库提交事务

  • 显示调用session.flush()方法

  • 在执行HQL或者QBC查询,会先进行flush()操作,以得到数据表最新的记录

refresh方法

将数据库同步到缓存中(会查询数据库),使缓存中的状态与数据库一致

session.refresh(); 
clear方法

清理缓存,可以将session中的缓存清除

session.clear();

四种状态的转换

临时状态(Transient)

  • 在使用代理主键的情况下,OID通常为null
  • 不处于session缓存中
  • 在数据库中也没有对应的记录,此时刚new了一个实体对象,还存在于保存临时数据的内存区域中

持久化状态(Persist)

  • OID不为null
  • 位于session缓存中
  • 若在数据库中已经有和其对应的记录,持久化对象和数据库中的相关记录对应
  • session在flush缓存时,会根据持久化对象的属性变化,来同步数据库
  • 在同一个session实例的缓存中,数据库表中每条记录只对应唯一的持久化对象
  • 持久化对象的id不可以被修改,因为hibernate是根据id去进行比较的

删除状态(Removed)

  • 在数据库中没有和其OID对应的记录
  • 不再处于session缓存中

游离状态(Detached)

  • OID不为null
  • 不再处于session缓存中
  • 一般情况下,游离对象是由持久化对象转变过来的(session进行close、clear、evict等情况),数据库中可能还存在它对应的记录,但是因为会话已经消失,对象不在持久化管理之内,所以处于游离状态
hibernate四种状态转换
hibernate四种状态转换
save方法和persist方法的区别

在调用persist()方法时如果存在id,则会抛出异常,而save方法则可以正常执行

org.hibernate.PersistentObjectException: detached entity passed to persist
get方法和load方法的区别
  • 执行get方法会立即加载对象,执行load方法若不使用该对象,则不会立即查询,而是返回一个代理对象(延时加载)

  • 若数据表中没有对应的记录,get方法返回null,load方法抛出异常

    org.hibernate.ObjectNotFoundException: No row with the given identifier exists
  • load方法可能会抛出懒加载异常

    org.hibernate.LazyInitializationException: could not initialize proxy - no Session

注意:在session缓存中不能够有两个相同OID的对象,否则会报异常

public static void testOid(Session session){
  User user = (User) session.get(User.class,1);
  System.out.println(user);
  User user1  = new User();
  user1.setId(1);
  user1.setName("王五");
  session.saveOrUpdate(user1);
}

org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session
evict方法

从session缓存中将指定的持久化对象移除

hibernate获取原生JDBC连接进行操作

可以使用doWork或者doReturnWork来使用原生JDBC操作数据

session.doWork(new Work() {
  @Override
  public void execute(Connection connection) throws SQLException {

  }
});

session.doReturningWork(new ReturningWork<Object>() {
  @Override
  public Object execute(Connection connection) throws SQLException {
    return null;
  }
});

session方法说明

public interface Session extends SharedSessionContract {
   /**
    * Obtain a {@link Session} builder with the ability to grab certain information from this session.
    *
    * @return The session builder
    */

   public SharedSessionBuilder sessionWithOptions();

   /**
    * Force this session to flush. Must be called at the end of a
    * unit of work, before committing the transaction and closing the
    * session (depending on {@link #setFlushMode(FlushMode)},
    * {@link Transaction#commit()} calls this method).
    * <p/>
    * <i>Flushing</i> is the process of synchronizing the underlying persistent
    * store with persistable state held in memory.
    *
    * @throws HibernateException Indicates problems flushing the session or
    * talking to the database.
    */

   public void flush() throws HibernateException;

   /**
    * Set the flush mode for this session.
    * <p/>
    * The flush mode determines the points at which the session is flushed.
    * <i>Flushing</i> is the process of synchronizing the underlying persistent
    * store with persistable state held in memory.
    * <p/>
    * For a logically "read only" session, it is reasonable to set the session's
    * flush mode to {@link FlushMode#MANUAL} at the start of the session (in
    * order to achieve some extra performance).
    *
    * @param flushMode the new flush mode
    * @see FlushMode
    */

   public void setFlushMode(FlushMode flushMode);

   /**
    * Get the current flush mode for this session.
    *
    * @return The flush mode
    */

   public FlushMode getFlushMode();

   /**
    * Set the cache mode.
    * <p/>
    * Cache mode determines the manner in which this session can interact with
    * the second level cache.
    *
    * @param cacheMode The new cache mode.
    */

   public void setCacheMode(CacheMode cacheMode);

   /**
    * Get the current cache mode.
    *
    * @return The current cache mode.
    */

   public CacheMode getCacheMode();

   // 获取创建该会话的sessionFactory
   public SessionFactory getSessionFactory();

   // 关闭数据库连接
   public Connection close() throws HibernateException;

   // 取消当前查询的执行
   public void cancelQuery() throws HibernateException;

   // 当前session是否开启
   public boolean isOpen();

   // 当前session是否连接
   public boolean isConnected();

   // 该session中是否包含必须与数据库痛的变化
   public boolean isDirty() throws HibernateException;

   /**
    * Will entities and proxies that are loaded into this session be made 
    * read-only by default?
    *
    * To determine the read-only/modifiable setting for a particular entity 
    * or proxy:
    * @see Session#isReadOnly(Object)
    *
    * @return true, loaded entities/proxies will be made read-only by default; 
    *         false, loaded entities/proxies will be made modifiable by default. 
    */

   public boolean isDefaultReadOnly();

   /**
    * Change the default for entities and proxies loaded into this session
    * from modifiable to read-only mode, or from modifiable to read-only mode.
    *
    * Read-only entities are not dirty-checked and snapshots of persistent
    * state are not maintained. Read-only entities can be modified, but
    * changes are not persisted.
    *
    * When a proxy is initialized, the loaded entity will have the same
    * read-only/modifiable setting as the uninitialized
    * proxy has, regardless of the session's current setting.
    *
    * To change the read-only/modifiable setting for a particular entity
    * or proxy that is already in this session:
    * @see Session#setReadOnly(Object,boolean)
    *
    * To override this session's read-only/modifiable setting for entities
    * and proxies loaded by a Query:
    * @see Query#setReadOnly(boolean)
    *
    * @param readOnly true, the default for loaded entities/proxies is read-only;
    *                 false, the default for loaded entities/proxies is modifiable
    */

   public void setDefaultReadOnly(boolean readOnly);

   // 返回与当前实体关联的会话标识符
   public Serializable getIdentifier(Object object);

   /**
    * Check if this instance is associated with this <tt>Session</tt>.
    *
    * @param object an instance of a persistent class
    * @return true if the given instance is associated with this <tt>Session</tt>
    */

   public boolean contains(Object object);

   /**
    * Remove this instance from the session cache. Changes to the instance will
    * not be synchronized with the database. This operation cascades to associated
    * instances if the association is mapped with <tt>cascade="evict"</tt>.
    *
    * @param object The entity to evict
    *
    * @throws NullPointerException if the passed object is {@code null}
    * @throws IllegalArgumentException if the passed object is not defined as an entity
    */

   public void evict(Object object);

   /**
    * Return the persistent instance of the given entity class with the given identifier,
    * obtaining the specified lock mode, assuming the instance exists.
    *
    * @param theClass a persistent class
    * @param id a valid identifier of an existing persistent instance of the class
    * @param lockMode the lock level
    *
    * @return the persistent instance or proxy
    *
    * @deprecated LockMode parameter should be replaced with LockOptions
    */

   @Deprecated
   public Object load(Class theClass, Serializable id, LockMode lockMode);

   /**
    * Return the persistent instance of the given entity class with the given identifier,
    * obtaining the specified lock mode, assuming the instance exists.
    *
    * @param theClass a persistent class
    * @param id a valid identifier of an existing persistent instance of the class
    * @param lockOptions contains the lock level
    * @return the persistent instance or proxy
    */

   public Object load(Class theClass, Serializable id, LockOptions lockOptions);

   /**
    * Return the persistent instance of the given entity class with the given identifier,
    * obtaining the specified lock mode, assuming the instance exists.
    *
    * @param entityName a persistent class
    * @param id a valid identifier of an existing persistent instance of the class
    * @param lockMode the lock level
    *
    * @return the persistent instance or proxy
    *
    * @deprecated LockMode parameter should be replaced with LockOptions
    */

   @Deprecated
   public Object load(String entityName, Serializable id, LockMode lockMode);

   /**
    * Return the persistent instance of the given entity class with the given identifier,
    * obtaining the specified lock mode, assuming the instance exists.
    *
    * @param entityName a persistent class
    * @param id a valid identifier of an existing persistent instance of the class
    * @param lockOptions contains the lock level
    *
    * @return the persistent instance or proxy
    */

   public Object load(String entityName, Serializable id, LockOptions lockOptions);

   /**
    * Return the persistent instance of the given entity class with the given identifier,
    * assuming that the instance exists. This method might return a proxied instance that
    * is initialized on-demand, when a non-identifier method is accessed.
    * <br><br>
    * You should not use this method to determine if an instance exists (use <tt>get()</tt>
    * instead). Use this only to retrieve an instance that you assume exists, where non-existence
    * would be an actual error.
    *
    * @param theClass a persistent class
    * @param id a valid identifier of an existing persistent instance of the class
    *
    * @return the persistent instance or proxy
    */

   public Object load(Class theClass, Serializable id);

   /**
    * Return the persistent instance of the given entity class with the given identifier,
    * assuming that the instance exists. This method might return a proxied instance that
    * is initialized on-demand, when a non-identifier method is accessed.
    * <br><br>
    * You should not use this method to determine if an instance exists (use <tt>get()</tt>
    * instead). Use this only to retrieve an instance that you assume exists, where non-existence
    * would be an actual error.
    *
    * @param entityName a persistent class
    * @param id a valid identifier of an existing persistent instance of the class
    *
    * @return the persistent instance or proxy
    */

   public Object load(String entityName, Serializable id);

   /**
    * Read the persistent state associated with the given identifier into the given transient
    * instance.
    *
    * @param object an "empty" instance of the persistent class
    * @param id a valid identifier of an existing persistent instance of the class
    */

   public void load(Object object, Serializable id);

   /**
    * Persist the state of the given detached instance, reusing the current
    * identifier value.  This operation cascades to associated instances if
    * the association is mapped with {@code cascade="replicate"}
    *
    * @param object a detached instance of a persistent class
    * @param replicationMode The replication mode to use
    */

   public void replicate(Object object, ReplicationMode replicationMode);

   /**
    * Persist the state of the given detached instance, reusing the current
    * identifier value.  This operation cascades to associated instances if
    * the association is mapped with {@code cascade="replicate"}
    *
    * @param entityName The entity name
    * @param object a detached instance of a persistent class
    * @param replicationMode The replication mode to use
    */

   public void replicate(String entityName, Object object, ReplicationMode replicationMode) ;

   // 保存对象,生成标识,变为持久化状态
   public Serializable save(Object object);

   // 保存对象,生成标识,变为持久化状态
   public Serializable save(String entityName, Object object);

   // 保存或更新对象
   public void saveOrUpdate(Object object);

   // 保存或更新对象
   public void saveOrUpdate(String entityName, Object object);

   // 更新该标识符所对应的对象
   public void update(Object object);

   
   // 更新该标识符所对应的对象
   public void update(String entityName, Object object);

   /**
    * Copy the state of the given object onto the persistent object with the same
    * identifier. If there is no persistent instance currently associated with
    * the session, it will be loaded. Return the persistent instance. If the
    * given instance is unsaved, save a copy of and return it as a newly persistent
    * instance. The given instance does not become associated with the session.
    * This operation cascades to associated instances if the association is mapped
    * with {@code cascade="merge"}
    * <p/>
    * The semantics of this method are defined by JSR-220.
    *
    * @param object a detached instance with state to be copied
    *
    * @return an updated persistent instance
    */

   public Object merge(Object object);

   /**
    * Copy the state of the given object onto the persistent object with the same
    * identifier. If there is no persistent instance currently associated with
    * the session, it will be loaded. Return the persistent instance. If the
    * given instance is unsaved, save a copy of and return it as a newly persistent
    * instance. The given instance does not become associated with the session.
    * This operation cascades to associated instances if the association is mapped
    * with {@code cascade="merge"}
    * <p/>
    * The semantics of this method are defined by JSR-220.
    *
    * @param entityName The entity name
    * @param object a detached instance with state to be copied
    *
    * @return an updated persistent instance
    */

   public Object merge(String entityName, Object object);

   /**
    * Make a transient instance persistent. This operation cascades to associated
    * instances if the association is mapped with {@code cascade="persist"}
    * <p/>
    * The semantics of this method are defined by JSR-220.
    *
    * @param object a transient instance to be made persistent
    */

   public void persist(Object object);
   /**
    * Make a transient instance persistent. This operation cascades to associated
    * instances if the association is mapped with {@code cascade="persist"}
    * <p/>
    * The semantics of this method are defined by JSR-220.
    *
    * @param entityName The entity name
    * @param object a transient instance to be made persistent
    */

   public void persist(String entityName, Object object);

   // 删除该持久化对象
   public void delete(Object object);

   // 删除该持久化对象
   public void delete(String entityName, Object object);

   /**
    * Obtain the specified lock level upon the given object. This may be used to
    * perform a version check (<tt>LockMode.READ</tt>), to upgrade to a pessimistic
    * lock (<tt>LockMode.PESSIMISTIC_WRITE</tt>), or to simply reassociate a transient instance
    * with a session (<tt>LockMode.NONE</tt>). This operation cascades to associated
    * instances if the association is mapped with <tt>cascade="lock"</tt>.
    *
    * @param object a persistent or transient instance
    * @param lockMode the lock level
    *
    * @deprecated instead call buildLockRequest(LockMode).lock(object)
    */

   @Deprecated
   public void lock(Object object, LockMode lockMode);

   /**
    * Obtain the specified lock level upon the given object. This may be used to
    * perform a version check (<tt>LockMode.OPTIMISTIC</tt>), to upgrade to a pessimistic
    * lock (<tt>LockMode.PESSIMISTIC_WRITE</tt>), or to simply reassociate a transient instance
    * with a session (<tt>LockMode.NONE</tt>). This operation cascades to associated
    * instances if the association is mapped with <tt>cascade="lock"</tt>.
    *
    * @param entityName The name of the entity
    * @param object a persistent or transient instance
    * @param lockMode the lock level
    *
    * @deprecated instead call buildLockRequest(LockMode).lock(entityName, object)
    */

   @SuppressWarnings( {"JavaDoc"})
   @Deprecated
   public void lock(String entityName, Object object, LockMode lockMode);

   /**
    * Build a LockRequest that specifies the LockMode, pessimistic lock timeout and lock scope.
    * timeout and scope is ignored for optimistic locking.  After building the LockRequest,
    * call LockRequest.lock to perform the requested locking. 
    * <p/>
    * Example usage:
    * {@code session.buildLockRequest().setLockMode(LockMode.PESSIMISTIC_WRITE).setTimeOut(60000).lock(entity);}
    *
    * @param lockOptions contains the lock level
    *
    * @return a lockRequest that can be used to lock the passed object.
    */

   public LockRequest buildLockRequest(LockOptions lockOptions);

   // 从数据库中重新读取该对象
   public void refresh(Object object);

   /**
    * Re-read the state of the given instance from the underlying database. It is
    * inadvisable to use this to implement long-running sessions that span many
    * business tasks. This method is, however, useful in certain special circumstances.
    * For example
    * <ul>
    * <li>where a database trigger alters the object state upon insert or update
    * <li>after executing direct SQL (eg. a mass update) in the same session
    * <li>after inserting a <tt>Blob</tt> or <tt>Clob</tt>
    * </ul>
    *
    * @param entityName a persistent class
    * @param object a persistent or detached instance
    */

   public void refresh(String entityName, Object object);

   /**
    * Re-read the state of the given instance from the underlying database, with
    * the given <tt>LockMode</tt>. It is inadvisable to use this to implement
    * long-running sessions that span many business tasks. This method is, however,
    * useful in certain special circumstances.
    *
    * @param object a persistent or detached instance
    * @param lockMode the lock mode to use
    *
    * @deprecated LockMode parameter should be replaced with LockOptions
    */

   @Deprecated
   public void refresh(Object object, LockMode lockMode);

   /**
    * Re-read the state of the given instance from the underlying database, with
    * the given <tt>LockMode</tt>. It is inadvisable to use this to implement
    * long-running sessions that span many business tasks. This method is, however,
    * useful in certain special circumstances.
    *
    * @param object a persistent or detached instance
    * @param lockOptions contains the lock mode to use
    */

   public void refresh(Object object, LockOptions lockOptions);

   /**
    * Re-read the state of the given instance from the underlying database, with
    * the given <tt>LockMode</tt>. It is inadvisable to use this to implement
    * long-running sessions that span many business tasks. This method is, however,
    * useful in certain special circumstances.
    *
    * @param entityName a persistent class
    * @param object a persistent or detached instance
    * @param lockOptions contains the lock mode to use
    */

   public void refresh(String entityName, Object object, LockOptions lockOptions);

   /**
    * Determine the current lock mode of the given object.
    *
    * @param object a persistent instance
    *
    * @return the current lock mode
    */

   public LockMode getCurrentLockMode(Object object);

   // 为给定集合和查询条件创建查询实例
   public Query createFilter(Object collection, String queryString);

   // 清除该会话
   public void clear();

   // 返回给定命名和标识符的持久化对象实例
   public Object get(Class clazz, Serializable id);

   

   /**
    * Return the persistent instance of the given entity class with the given identifier,
    * or null if there is no such persistent instance. (If the instance is already associated
    * with the session, return that instance. This method never returns an uninitialized instance.)
    * Obtain the specified lock mode if the instance exists.
    *
    * @param clazz a persistent class
    * @param id an identifier
    * @param lockOptions the lock mode
    *
    * @return a persistent instance or null
    */

   public Object get(Class clazz, Serializable id, LockOptions lockOptions);

   // 返回给定命名和标识符的持久化对象实例
   public Object get(String entityName, Serializable id);

   /**
    * Return the persistent instance of the given entity class with the given identifier,
    * or null if there is no such persistent instance. (If the instance is already associated
    * with the session, return that instance. This method never returns an uninitialized instance.)
    * Obtain the specified lock mode if the instance exists.
    *
    * @param entityName the entity name
    * @param id an identifier
    * @param lockOptions contains the lock mode
    *
    * @return a persistent instance or null
    */

   public Object get(String entityName, Serializable id, LockOptions lockOptions);

   /**
    * Return the entity name for a persistent entity.
    *   
    * @param object a persistent entity
    *
    * @return the entity name
    */

   public String getEntityName(Object object);
   
   /**
    * Create an {@link IdentifierLoadAccess} instance to retrieve the specified entity type by
    * primary key.
    * 
    * @param entityName The entity name of the entity type to be retrieved
    *
    * @return load delegate for loading the specified entity type by primary key
    *
    * @throws HibernateException If the specified entity name cannot be resolved as an entity name
    */

   public IdentifierLoadAccess byId(String entityName);

   /**
    * Create an {@link IdentifierLoadAccess} instance to retrieve the specified entity by
    * primary key.
    *
    * @param entityClass The entity type to be retrieved
    *
    * @return load delegate for loading the specified entity type by primary key
    *
    * @throws HibernateException If the specified Class cannot be resolved as a mapped entity
    */

   public IdentifierLoadAccess byId(Class entityClass);

   /**
    * Create an {@link NaturalIdLoadAccess} instance to retrieve the specified entity by
    * its natural id.
    * 
    * @param entityName The entity name of the entity type to be retrieved
    *
    * @return load delegate for loading the specified entity type by natural id
    *
    * @throws HibernateException If the specified entity name cannot be resolved as an entity name
    */

   public NaturalIdLoadAccess byNaturalId(String entityName);

   /**
    * Create an {@link NaturalIdLoadAccess} instance to retrieve the specified entity by
    * its natural id.
    * 
    * @param entityClass The entity type to be retrieved
    *
    * @return load delegate for loading the specified entity type by natural id
    *
    * @throws HibernateException If the specified Class cannot be resolved as a mapped entity
    */

   public NaturalIdLoadAccess byNaturalId(Class entityClass);

   /**
    * Create an {@link SimpleNaturalIdLoadAccess} instance to retrieve the specified entity by
    * its natural id.
    *
    * @param entityName The entity name of the entity type to be retrieved
    *
    * @return load delegate for loading the specified entity type by natural id
    *
    * @throws HibernateException If the specified entityClass cannot be resolved as a mapped entity, or if the
    * entity does not define a natural-id or if its natural-id is made up of multiple attributes.
    */

   public SimpleNaturalIdLoadAccess bySimpleNaturalId(String entityName);

   /**
    * Create an {@link SimpleNaturalIdLoadAccess} instance to retrieve the specified entity by
    * its simple (single attribute) natural id.
    *
    * @param entityClass The entity type to be retrieved
    *
    * @return load delegate for loading the specified entity type by natural id
    *
    * @throws HibernateException If the specified entityClass cannot be resolved as a mapped entity, or if the
    * entity does not define a natural-id or if its natural-id is made up of multiple attributes.
    */

   public SimpleNaturalIdLoadAccess bySimpleNaturalId(Class entityClass);

   /**
    * Enable the named filter for this current session.
    *
    * @param filterName The name of the filter to be enabled.
    *
    * @return The Filter instance representing the enabled filter.
    */

   public Filter enableFilter(String filterName);

   /**
    * Retrieve a currently enabled filter by name.
    *
    * @param filterName The name of the filter to be retrieved.
    *
    * @return The Filter instance representing the enabled filter.
    */

   public Filter getEnabledFilter(String filterName);

   /**
    * Disable the named filter for the current session.
    *
    * @param filterName The name of the filter to be disabled.
    */

   public void disableFilter(String filterName);
   
   /**
    * Get the statistics for this session.
    *
    * @return The session statistics being collected for this session
    */

   public SessionStatistics getStatistics();

   /**
    * Is the specified entity or proxy read-only?
    *
    * To get the default read-only/modifiable setting used for
    * entities and proxies that are loaded into the session:
    * @see org.hibernate.Session#isDefaultReadOnly()
    *
    * @param entityOrProxy an entity or HibernateProxy
    * @return {@code true} if the entity or proxy is read-only, {@code false} if the entity or proxy is modifiable.
    */

   public boolean isReadOnly(Object entityOrProxy);

   /**
    * Set an unmodified persistent object to read-only mode, or a read-only
    * object to modifiable mode. In read-only mode, no snapshot is maintained,
    * the instance is never dirty checked, and changes are not persisted.
    *
    * If the entity or proxy already has the specified read-only/modifiable
    * setting, then this method does nothing.
    * 
    * To set the default read-only/modifiable setting used for
    * entities and proxies that are loaded into the session:
    * @see org.hibernate.Session#setDefaultReadOnly(boolean)
    *
    * To override this session's read-only/modifiable setting for entities
    * and proxies loaded by a Query:
    * @see Query#setReadOnly(boolean)
    * 
    * @param entityOrProxy an entity or HibernateProxy
    * @param readOnly {@code true} if the entity or proxy should be made read-only; {@code false} if the entity or
    * proxy should be made modifiable
    */

   public void setReadOnly(Object entityOrProxy, boolean readOnly);

   /**
    * Controller for allowing users to perform JDBC related work using the Connection managed by this Session.
    *
    * @param work The work to be performed.
    * @throws HibernateException Generally indicates wrapped {@link java.sql.SQLException}
    */

   public void doWork(Work work) throws HibernateException;

   /**
    * Controller for allowing users to perform JDBC related work using the Connection managed by this Session.  After
    * execution returns the result of the {@link ReturningWork#execute} call.
    *
    * @param work The work to be performed.
    * @param <T> The type of the result returned from the work
    *
    * @return the result from calling {@link ReturningWork#execute}.
    *
    * @throws HibernateException Generally indicates wrapped {@link java.sql.SQLException}
    */

   public <T> doReturningWork(ReturningWork<T> work) throws HibernateException;

   /**
    * Disconnect the session from its underlying JDBC connection.  This is intended for use in cases where the
    * application has supplied the JDBC connection to the session and which require long-sessions (aka, conversations).
    * <p/>
    * It is considered an error to call this method on a session which was not opened by supplying the JDBC connection
    * and an exception will be thrown.
    * <p/>
    * For non-user-supplied scenarios, normal transaction management already handles disconnection and reconnection
    * automatically.
    *
    * @return the application-supplied connection or {@code null}
    *
    * @see #reconnect(Connection)
    */

   Connection disconnect();

   /**
    * Reconnect to the given JDBC connection.
    *
    * @param connection a JDBC connection
    * 
    * @see #disconnect()
    */

   void reconnect(Connection connection);

   /**
    * Is a particular fetch profile enabled on this session?
    *
    * @param name The name of the profile to be checked.
    * @return True if fetch profile is enabled; false if not.
    * @throws UnknownProfileException Indicates that the given name does not
    * match any known profile names
    *
    * @see org.hibernate.engine.profile.FetchProfile for discussion of this feature
    */

   public boolean isFetchProfileEnabled(String name) throws UnknownProfileException;

   /**
    * Enable a particular fetch profile on this session.  No-op if requested
    * profile is already enabled.
    *
    * @param name The name of the fetch profile to be enabled.
    * @throws UnknownProfileException Indicates that the given name does not
    * match any known profile names
    *
    * @see org.hibernate.engine.profile.FetchProfile for discussion of this feature
    */

   public void enableFetchProfile(String name) throws UnknownProfileException;

   /**
    * Disable a particular fetch profile on this session.  No-op if requested
    * profile is already disabled.
    *
    * @param name The name of the fetch profile to be disabled.
    * @throws UnknownProfileException Indicates that the given name does not
    * match any known profile names
    *
    * @see org.hibernate.engine.profile.FetchProfile for discussion of this feature
    */

   public void disableFetchProfile(String name) throws UnknownProfileException;

   /**
    * Convenience access to the {@link TypeHelper} associated with this session's {@link SessionFactory}.
    * <p/>
    * Equivalent to calling {@link #getSessionFactory()}.{@link SessionFactory#getTypeHelper getTypeHelper()}
    *
    * @return The {@link TypeHelper} associated with this session's {@link SessionFactory}
    */

   public TypeHelper getTypeHelper();

   /**
    * Retrieve this session's helper/delegate for creating LOB instances.
    *
    * @return This session's LOB helper
    */

   public LobHelper getLobHelper();

   /**
    * Contains locking details (LockMode, Timeout and Scope).
    */

   public interface LockRequest {
      /**
       * Constant usable as a time out value that indicates no wait semantics should be used in
       * attempting to acquire locks.
       */

      static final int PESSIMISTIC_NO_WAIT = 0;
      /**
       * Constant usable as a time out value that indicates that attempting to acquire locks should be allowed to
       * wait forever (apply no timeout).
       */

      static final int PESSIMISTIC_WAIT_FOREVER = -1;

      /**
       * Get the lock mode.
       *
       * @return the lock mode.
       */

      LockMode getLockMode();

      /**
       * Specify the LockMode to be used.  The default is LockMode.none.
       *
       * @param lockMode The lock mode to use for this request
       *
       * @return this LockRequest instance for operation chaining.
       */

      LockRequest setLockMode(LockMode lockMode);

      /**
       * Get the timeout setting.
       *
       * @return timeout in milliseconds, -1 for indefinite wait and 0 for no wait.
       */

      int getTimeOut();

      /**
       * Specify the pessimistic lock timeout (check if your dialect supports this option).
       * The default pessimistic lock behavior is to wait forever for the lock.
       *
       * @param timeout is time in milliseconds to wait for lock.  -1 means wait forever and 0 means no wait.
       *
       * @return this LockRequest instance for operation chaining.
       */

      LockRequest setTimeOut(int timeout);

      /**
       * Check if locking is cascaded to owned collections and relationships.
       *
       * @return true if locking will be extended to owned collections and relationships.
       */

      boolean getScope();

      /**
       * Specify if LockMode should be cascaded to owned collections and relationships.
       * The association must be mapped with {@code cascade="lock"} for scope=true to work.
       *
       * @param scope {@code true} to cascade locks; {@code false} to not.
       *
       * @return {@code this}, for method chaining
       */

      LockRequest setScope(boolean scope);

      /**
       * Perform the requested locking.
       *
       * @param entityName The name of the entity to lock
       * @param object The instance of the entity to lock
       */

      void lock(String entityName, Object object);

      /**
       * Perform the requested locking.
       *
       * @param object The instance of the entity to lock
       */

      void lock(Object object);
   }

   /**
    * Add one or more listeners to the Session
    *
    * @param listeners The listener(s) to add
    */

   public void addEventListeners(SessionEventListener... listeners);
}

[https://zhhll.icu/2020/框架/hibernate/基础/6.hibernate session接口/](https://zhhll.icu/2020/框架/hibernate/基础/6.hibernate session接口/)

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1564782.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能视频翻译和配音处理工具:Pyvideotrans

pyVideoTrans&#xff1a;一键字幕识别翻译配音带新语言字幕和配音的视频 - 精选真开源&#xff0c;释放新价值。 概览 Pyvideotrans是一款卓著的智能化视频处理系统&#xff0c;专精于视频翻译与配音艺术&#xff0c;以其卓越的技术实力实现对原始视频中音频信息的精准捕捉、…

CCIE-03-Layer2-LAN-TS

目录 实验条件网络拓朴实验目标 开始排错问题1. SW2上的DHCP中继没有配置正确问题2. SW1/SW2的SVI接口被关闭问题3. 安全端口配置了不同的MAC地址 实验条件 网络拓朴 Output1 Output2 实验目标 排除故障使得PC101访问Server1时符合图片中给出的Output 开始排错 根据要求…

并发编程01-深入理解Java并发/线程等待/通知机制

为什么我们要学习并发编程&#xff1f; 最直白的原因&#xff0c;因为面试需要&#xff0c;我们来看看美团和阿里对 Java 岗位的 JD&#xff1a; 从上面两大互联网公司的招聘需求可以看到&#xff0c; 大厂的 Java 岗的并发编程能力属于标配。 而在非大厂的公司&#xff0c; 并…

基于栈结构的非递归二叉树结点关键字输出算法

基于栈结构的非递归二叉树结点关键字输出算法 一、引言二、二叉树基本概念三、非递归遍历算法基础四、算法设计五、算法实现六、C代码示例七、算法分析八、优化与讨论 一、引言 在计算机科学中&#xff0c;二叉树是一种重要的数据结构&#xff0c;它广泛应用于各种算法和数据结…

笔记: javaSE day17天笔记

第十七天课堂笔记 Java常用类 数学类★★★ math java.lang.Math , 数学类 round(x) : 四舍五入 , 把 x加0.5 后向下取整 ceil(x) : 返回大于等于x的最小整数 , 向上取整 floor(x) : 返回小于等于x的最大整数 , 向下取整 sqrt(x) : 平方根 cbrt(x): 立方根 pow(a , b)…

App应用的服务器如何增加高并发能力

大家好&#xff01;我是你们的好朋友咕噜铁蛋&#xff01;近年来&#xff0c;随着移动互联网的蓬勃发展&#xff0c;各类App应用如雨后春笋般涌现&#xff0c;用户量呈现爆发式增长。然而&#xff0c;随之而来的高并发访问问题也开始频繁出现&#xff0c;给服务器带来了极大的挑…

ecology9.0通过自定义按钮给明细表某字段赋值

功能&#xff1a;把主表字段赋值给明细表字段 核心代码&#xff1a; <script>jQuery(document).ready(function(){$(#setcgy).click(function(){var cgy_txt WfForm.getBrowserShowName("field1207");debuggervar cgy WfForm.getFieldValue("field1207…

java(5)之数组

1、什么是数组 数组就是用来储存相同数据类型的数据集合&#xff0c;可使用共同的名称来引用数组中的数据&#xff0c;数组的类型有很多种&#xff0c;但是指定了数组的类型就只能存储这一类数据。 2、数组的特点 1、既能存储原始数据也能催出对象类型 2、长度一旦确定就不…

MySQL进阶-----SQL提示与覆盖索引

目录 前言 一、SQL提示 1.数据准备 2. SQL的自我选择 3.SQL提示 二、覆盖索引 前言 MySQL进阶篇的索引部分基本上要结束了&#xff0c;这里就剩下SQL提示、覆盖索引、前缀索引以及单例联合索引的内容。那本期的话我们就先讲解SQL提示和覆盖索引先&#xff0c;剩下的内容就…

ssm 设备采购管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 ssm 设备采购管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模…

使用 Docker Compose 部署邮件服务器

使用 Docker Compose 部署邮件服务器 很多时候为了方便&#xff0c; 我们都直接使用第三方邮箱进行收发邮件。 但第三方邮箱有些要求定期修改密码&#xff0c;有些限制发邮箱的次数&#xff0c; 对于一些个人和企业来说&#xff0c; 有自己的域名和服务器为什么不自己搭建一个邮…

PEFT-LISA

LISA是LoRA的简化版&#xff0c;但其抓住了LoRA微调的核心&#xff0c;即LoRA侧重更新LLM的底层embedding和顶层head。 根据上述现象&#xff0c;LISA提出两点改进&#xff1a; 始终更新LLM的底层embedding和顶层head随机更新中间层的hidden state 实验结果 显存占用 毕竟模型…

ZKP价值链路的垂直整合

1. ZKP proof生命周期 从ZKP&#xff08;zero-knowledge proof&#xff09;生命周期&#xff0c;先看围绕ZKP的价值链路形成&#xff1a; 1&#xff09;User intent用户意图&#xff1a;以某用户意图为起点&#xff0c;如想要在某zk-rollup上swap某token、证明其身份、执行某…

HarmonyOS 和 OpenHarmony

HarmonyOS 和 OpenHarmony 支持的 shell 命令不同&#xff0c;因此有时候需要做一做区分&#xff0c;目前有些文档上没有标注&#xff0c;因此可能产生歧义。 HarmonyOS 支持 getprop&#xff1a; getprop hw_sc.build.os.apiversion # 查看API版本OpenHarmony 上支持 param…

华为ensp中ospf多区域管理 原理及配置命令(详解)

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; ————前言———— OSPF 多区域的主要作用是缩小链路状态数据库和路由表的规模&#xff0c;减少路由更新的频率&#xff0c;提高网络的可扩展性&#xff0c;实现路由过滤和路由汇总&#xff0…

Java多线程实战-从零手搓一个简易线程池(三)线程工厂,核心线程与非核心线程逻辑实现

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️本系列源码仓库&#xff1a;多线程并发编程学习的多个代码片段(github) &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正…

使用ARCore深度API实现点云采集

一、深度API 本小节内容摘自ARCore官方文档。 ARCore 深度API Depth API 可助力实现对象遮挡、提升沉浸感和新颖的互动体验&#xff0c;从而增强 AR 体验的真实感。 在下图中&#xff0c;右侧画面是采用深度API进行遮挡后的效果&#xff0c;与左侧图相比更加真实。 深度值 给…

【热门话题】WebKit架构简介

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 WebKit架构简介一、引言二、WebKit概览1. 起源与发展2. 模块化设计 三、WebCore…

补充知识

补充知识1 内存的本质是对数据的临时存储 内存与磁盘进行交互时&#xff0c; 最小单位是4kb叫做页框(内存)和页帧(磁盘) 也就是&#xff0c; 如果我们要将磁盘的内容加载到内存中&#xff0c; 可是文件大小只有1kb&#xff0c; 我们也要拿出4kb来存他&#xff0c; 多余的就直…

element-ui card 组件源码分享

今日简单分享 card 组件源码&#xff0c;主要从以下两个方面&#xff1a; 一、card 组件页面结构 二、card 组件属性 2.1 header 属性&#xff0c;设置 header&#xff0c;也可以通过 slot#header 传入 DOM&#xff0c;类型 string&#xff0c;无默认值。 组件使用部分&#…