hibernate中的session中的方法(网页资料整理)
2011-12-12 18:03
1466 查看
Session接口的API
Java应用程序与Hibernate之间的主要运行时接口。它是抽象了持久化服务概念的核心抽象API类。
Session的生命周期绑定在一个物理的事务(tansaction)上面。(长的事务可能跨越多个数据库事物。)
Session的主要功能是提供对映射的实体类实例的创建,读取和删除操作。实例可能以下面三种状态存在:
自由状态(transient): 不曾进行持久化,未与任何Session相关联
持久化状态(persistent): 仅与一个Session相关联
游离状态(detached): 已经进行过持久化,但当前未与任何Session相关联
游离状态的实例可以通过调用save()、persist()或者saveOrUpdate()方法进行持久化。持久化实例可以通过调用 delete()变成游离状态。
通过get()或load()方法得到的实例都是持久化状态的。游离状态的实例可以通过调用 update()、0saveOrUpdate()、lock()或者replicate()进行持久化。
游离或者自由状态下的实例可以通过调用merge()方法成为一个新的持久化实例。
save()和persist()将会引发SQL的INSERT,delete()会引发SQLDELETE,而update()或merge()会引发SQLUPDATE。
对持久化(persistent)实例的修改在刷新提交的时候会被检测到,它也会引起SQLUPDATE。
saveOrUpdate()或者replicate()会引发SQLINSERT或者UPDATE。
其具体实现并不一定是线程安全的。每个线程/事务应该从一个SessionFactory获取自己的session实例。
如果其持久化对象类是可序列化的,则Session实例也是可序列化的。
一个典型的事务应该使用下面的形式:
Session sess = factory.openSession();
Transaction tx;
try {
tx =sess.beginTransaction();
//do some work ...
tx.commit();
} catch (Exception e) {
if (tx!=null)
tx.rollback();
throw e;
} finally {
sess.close();
}
如果Session抛出了异常, 事务必须回滚而session会被废弃。在异常发生后Session的内部状态可能会与数据库失去同步。
Session接口
Session接口是Java应用程序和Hibernate进行交互时所使用的主要接口, 这也是持久化操作的核心API。Session对象是有生命周期的,
它以Transaction对象的事务开始和结束为边界。Session对象不是线程安全的,每个调用者应该使用SessionFactory实例获得组件的Session实例。
Session主要的功能是读取、创建和删除映射对象的实例,这一系列的操作将被转换为对数据库表中的增加、修改、查询和删除操作。
创建Session实例可以采用以下代码来实现:
Configuration cof=newConfiguration().config();
SessionFactorysessionFactory=cof.buildSessionFactory();
Session session=sessionFactory.openSession();
1、Session的save()/persist()/update()/saveOrUpdate()/merge()/delete()方法
save()方法将指定对象保存,插入表中一条数据;
update()方法将指定对象更新,更新表中一条数据;
saveOrUpdate()方法接收一个实体对象,根据实体对象的id判断是否已经存在进行保存或更新操作,这样保存和更新方法就统一了;
merge()方法将给定的对象的状态复制到具有相同标识的持久化对象上。
delete()方法将指定对象删除,删除表中一条数据;
特别注意:为了使用saveOrUpdate()方法,在由定义映射文件时,通过设定<id>标签的unsaved-value="null"来判断执行什么操作:
当id属性等于unsaved-value的值(在此为null)时,则认为还没有保存,应该执行保存操作,否则执行更新操作。
这样设定之后,可以使用saveOrUpdate()方法来统一保存和更新的方法。
<id name="id" column="id"type="java.lang.Integer" unsaved-value="null">
<generator class="native"/>
</id>
unsaved-value可以设定的值有四个:
any:总是储存
none:总是更新
null:id为null时储存(预设)
valid:id为null或是指定值时储存
2、Session的get()/load()方法
get()方法会总是查询实体对象,不存在时候返回null;
load()方法也是获取一个实体对象,不存在时候抛空指针异常。
3、Session的clear()/evict()方法
clear()方法清除Session级别缓存中的所有实体(包括各种状态)对象,目的是释放内存。
evict()方法清除Session级别缓存中的指定的实体(包括各种状态)对象。
Session关闭后,这些缓存也就不存在了,会等待JVM回收。
4、Session的flush()方法
flush()强制持久化Session缓存中的实体对象。一般还会调用clear()或evict(),目的是赶紧保存,释放宝贵内存资源。
5、Session的commit()/rollback()方法
commit()方法用于提交Session上的事务,否则工作单元不会对数据库产生影响。
如果执行出现异常(也就是commit()失败了),则之前的操作取消,执行rollback()可撤消之前的操作。
6、Session的close()/isOpen()/isConnected()/reconnect()方法
close()方法关闭Session所对应数据库连接,与其相关联的对象生命周期结束。
isOpen()方法检查Session是否仍然打开,如果Session已经断开,则可以使用reconnect(Connection connection)来重新让Session关联一个JDBC连接。
isConnected()方法检查当前Session是否处于连接状态。
Method Summary | |
Transaction | beginTransaction() 开始一个工作单元并且返回相关联的事务(Transaction)对象。 |
void | cancelQuery() 终止执行当前查询。 |
void | clear() 完整的清除这个session。 |
Connection | close() 停止这个Session,通过中断JDBC连接并且清空(cleaning up)它。 |
Connection | connection() 获取这个Session的JDBC连接。 如果这个session使用了积极的collection释放策略(如CMT-容器控制事务的环境下), 关闭这个调用的连接的职责应该由当前应用程序负责。 |
boolean | contains(Object object) 检查这个对象实例是否与当前的Session关联(即是否为Persistent状态)。 |
Criteria | createCriteria(Class persistentClass) 为给定的实体类或它的超类创建一个新的Criteria实例。 |
Criteria | createCriteria(Class persistentClass, String alias) 根据给定的实体类或者它的超类创建一个新的Criteria实例,并赋予它(实体类)一个别名。 |
Criteria | createCriteria(String entityName) 根据给定的实体的名称(name),创建一个新的Criteria实例。 |
Criteria | createCriteria(String entityName, String alias) 根据给定的实体的名称(name),创建一个新的Criteria实例,并赋予它(实体类)一个别名 |
Query | createFilter(Object collection, String queryString) 根据给定的collection和过滤字符串(查询条件)创建一个新的Query实例。 |
Query | createQuery(String queryString) 根据给定的HQL查询条件创建一个新的Query实例。 |
SQLQuery | createSQLQuery(String queryString) 根据给定的SQL查询条件创建一个新的SQLQuery实例。 |
void | delete(Object object) 从数据库中移除持久化(persistent)对象的实例。 |
void | delete(String entityName, Object object) 从数据库中移除持久化(persistent)对象的实例。 |
void | disableFilter(String filterName) 禁用当前session的名称过滤器。 |
Connection | disconnect() 断开Session与当前的JDBC连接。 |
Filter | enableFilter(String filterName) 打开当前session的名称过滤器。 |
void | evict(Object object) 将当前对象实例从session缓存中清除。 |
void | flush() 强制提交刷新(flush)Session。 |
Object | get(Class clazz, Serializable id) 根据给定标识和实体类返回持久化对象的实例,如果没有符合条件的持久化对象实例则返回null。 |
Object | get(Class clazz, Serializable id, LockMode lockMode) 根据给定标识和实体类返回持久化对象的实例,如果没有符合条件的持久化对象实例则返回null。 |
Object | get(String entityName, Serializable id) 返回与给定的实体命名和标识匹配的持久化实例,如果没有对应的持久化实例则返回null。 |
Object | get(String entityName, Serializable id, LockMode lockMode) 返回与给定的实体类和标识所匹配的持久化实例,如果没有对应的持久化实例则返回null。 |
CacheMode | getCacheMode() 得到当前的缓存模式。 |
LockMode | getCurrentLockMode(Object object) 检测给定对象当前的锁定级别。 |
Filter | getEnabledFilter(String filterName) 根据名称获取一个当前允许的过滤器(filter)。 |
EntityMode | getEntityMode() 获取这个session有效的实体模式。 |
String | getEntityName(Object object) 返回一个持久化对象的实体名称。 |
FlushMode | getFlushMode() 获得当前的刷新提交(flush)模式。 |
Serializable | getIdentifier(Object object) 获取给定的实体对象实例在Session的缓存中的标识, 如果该实例是自由状态(Transient)的或者与其它Session关联则抛出一个异常。 |
Query | getNamedQuery(String queryName) 从映射文件中根据给定的查询的名称字符串获取一个Query(查询)实例。 |
Session | getSession(EntityMode entityMode) 根据给定的实体模式(Entity Mode)开始一个新的有效的Session。 |
SessionFactory | getSessionFactory() 获取创建这个session的SessionFactory实例。 |
SessionStatistics | getStatistics() 获取这个session的统计信息。 |
Transaction | getTransaction() 获取与这个session关联的Transaction(事务)实例。 instance associated with this session. |
boolean | isConnected() 检查当前Session是否处于连接状态。 |
boolean | isDirty() 当前Session是否包含需要与数据库同步的(数据状态)变化 ? 如果我们刷新提交(flush)这个session是否会有SQL执行? |
boolean | isOpen() 检查当前Session是否仍然打开。 |
Object | load(Class theClass, Serializable id) 在符合条件的实例存在的情况下,根据给定的实体类和标识返回持久化状态的实例。 |
Object | load(Class theClass, Serializable id, LockMode lockMode) 在符合条件的实例存在的情况下,根据给定的实体类、标识及指定的锁定等级返回持久化状态的实例。 |
void | load(Object object, Serializable id) 将与给定的标示对应的持久化状态(值)复制到给定的自由状态(trasient)实例上。 |
Object | load(String entityName, Serializable id) 在符合条件的实例存在的情况下,根据给定的实体类和标识返回持久化状态的实例。 |
Object | load(String entityName, Serializable id, LockMode lockMode) 在符合条件的实例存在的情况下,根据给定的实体类、标识及指定的锁定等级返回持久化状态的实例。 |
void | lock(Object object, LockMode lockMode) 从给定的对象上获取指定的锁定级别。 |
void | lock(String entityName, Object object, LockMode lockMode) 从给定的对象上获取指定的锁定级别。 |
Object | merge(Object object) 将给定的对象的状态复制到具有相同标识的持久化对象上。 |
Object | merge(String entityName, Object object) 将给定的对象的状态复制到具有相同标识的持久化对象上。 |
void | persist(Object object) 将一个自由状态(transient)的实例持久化。 |
void | persist(String entityName, Object object) 将一个自由状态(transient)的实例持久化。 |
void | reconnect() 不推荐的。 手工的重新连接只应用于应用程序提供连接的情况, 在这种情况下或许应该使用reconnect(java.sql.Connection)。 |
void | reconnect(Connection connection) 重新连接到给定的JDBC连接。 |
void | refresh(Object object) 从数据库中重新读取给定实例的状态。 |
void | refresh(Object object, LockMode lockMode) 根据指定的锁定模式(LockMode),从数据库中重新读取给定实例的状态。 |
void | replicate(Object object, ReplicationMode replicationMode) 使用当前的标识值持久化给定的游离状态(Transient)的实体。 |
void | replicate(String entityName, Object object,ReplicationMode replicationMode) 使用当前的标识值持久化给定的游离状态(Transient)的实体。 |
Serializable | save(Object object) 首先为给定的自由状态(Transient)的对象(根据配置)生成一个标识并赋值,然后将其持久化。 |
Serializable | save(String entityName, Object object) 首先为给定的自由状态(Transient)的对象(根据配置)生成一个标识并赋值,然后将其持久化。 |
void | saveOrUpdate(Object object) 根据给定的实例的标识属性的值(注:可以指定unsaved-value。一般默认null。)来决定执行 save() 或update()操作。 |
void | saveOrUpdate(String entityName, Object object) 根据给定的实例的标识属性的值(注:可以指定unsaved-value。一般默认null。)来决定执行 save() 或update()操作。 |
void | setCacheMode(CacheMode cacheMode) 设置刷新提交模式。 |
void | setFlushMode(FlushMode flushMode) 设置刷新提交模式。 |
void | setReadOnly(Object entity, boolean readOnly) 将一个未经更改的持久化对象设置为只读模式,或者将一个只读对象标记为可以修改的模式。 |
void | update(Object object) 根据给定的detached(游离状态)对象实例的标识更新对应的持久化实例。 |
void | update(String entityName, Object object) 根据给定的detached(游离状态)对象实例的标识更新对应的持久化实例。 |
Session的生命周期绑定在一个物理的事务(tansaction)上面。(长的事务可能跨越多个数据库事物。)
Session的主要功能是提供对映射的实体类实例的创建,读取和删除操作。实例可能以下面三种状态存在:
自由状态(transient): 不曾进行持久化,未与任何Session相关联
持久化状态(persistent): 仅与一个Session相关联
游离状态(detached): 已经进行过持久化,但当前未与任何Session相关联
游离状态的实例可以通过调用save()、persist()或者saveOrUpdate()方法进行持久化。持久化实例可以通过调用 delete()变成游离状态。
通过get()或load()方法得到的实例都是持久化状态的。游离状态的实例可以通过调用 update()、0saveOrUpdate()、lock()或者replicate()进行持久化。
游离或者自由状态下的实例可以通过调用merge()方法成为一个新的持久化实例。
save()和persist()将会引发SQL的INSERT,delete()会引发SQLDELETE,而update()或merge()会引发SQLUPDATE。
对持久化(persistent)实例的修改在刷新提交的时候会被检测到,它也会引起SQLUPDATE。
saveOrUpdate()或者replicate()会引发SQLINSERT或者UPDATE。
其具体实现并不一定是线程安全的。每个线程/事务应该从一个SessionFactory获取自己的session实例。
如果其持久化对象类是可序列化的,则Session实例也是可序列化的。
一个典型的事务应该使用下面的形式:
Session sess = factory.openSession();
Transaction tx;
try {
tx =sess.beginTransaction();
//do some work ...
tx.commit();
} catch (Exception e) {
if (tx!=null)
tx.rollback();
throw e;
} finally {
sess.close();
}
如果Session抛出了异常, 事务必须回滚而session会被废弃。在异常发生后Session的内部状态可能会与数据库失去同步。
Session接口
Session接口是Java应用程序和Hibernate进行交互时所使用的主要接口, 这也是持久化操作的核心API。Session对象是有生命周期的,
它以Transaction对象的事务开始和结束为边界。Session对象不是线程安全的,每个调用者应该使用SessionFactory实例获得组件的Session实例。
Session主要的功能是读取、创建和删除映射对象的实例,这一系列的操作将被转换为对数据库表中的增加、修改、查询和删除操作。
创建Session实例可以采用以下代码来实现:
Configuration cof=newConfiguration().config();
SessionFactorysessionFactory=cof.buildSessionFactory();
Session session=sessionFactory.openSession();
1、Session的save()/persist()/update()/saveOrUpdate()/merge()/delete()方法
save()方法将指定对象保存,插入表中一条数据;
update()方法将指定对象更新,更新表中一条数据;
saveOrUpdate()方法接收一个实体对象,根据实体对象的id判断是否已经存在进行保存或更新操作,这样保存和更新方法就统一了;
merge()方法将给定的对象的状态复制到具有相同标识的持久化对象上。
delete()方法将指定对象删除,删除表中一条数据;
特别注意:为了使用saveOrUpdate()方法,在由定义映射文件时,通过设定<id>标签的unsaved-value="null"来判断执行什么操作:
当id属性等于unsaved-value的值(在此为null)时,则认为还没有保存,应该执行保存操作,否则执行更新操作。
这样设定之后,可以使用saveOrUpdate()方法来统一保存和更新的方法。
<id name="id" column="id"type="java.lang.Integer" unsaved-value="null">
<generator class="native"/>
</id>
unsaved-value可以设定的值有四个:
any:总是储存
none:总是更新
null:id为null时储存(预设)
valid:id为null或是指定值时储存
2、Session的get()/load()方法
get()方法会总是查询实体对象,不存在时候返回null;
load()方法也是获取一个实体对象,不存在时候抛空指针异常。
3、Session的clear()/evict()方法
clear()方法清除Session级别缓存中的所有实体(包括各种状态)对象,目的是释放内存。
evict()方法清除Session级别缓存中的指定的实体(包括各种状态)对象。
Session关闭后,这些缓存也就不存在了,会等待JVM回收。
4、Session的flush()方法
flush()强制持久化Session缓存中的实体对象。一般还会调用clear()或evict(),目的是赶紧保存,释放宝贵内存资源。
5、Session的commit()/rollback()方法
commit()方法用于提交Session上的事务,否则工作单元不会对数据库产生影响。
如果执行出现异常(也就是commit()失败了),则之前的操作取消,执行rollback()可撤消之前的操作。
6、Session的close()/isOpen()/isConnected()/reconnect()方法
close()方法关闭Session所对应数据库连接,与其相关联的对象生命周期结束。
isOpen()方法检查Session是否仍然打开,如果Session已经断开,则可以使用reconnect(Connection connection)来重新让Session关联一个JDBC连接。
isConnected()方法检查当前Session是否处于连接状态。
相关文章推荐
- hibernate中的session中的方法(网页资料整理) http://blog.csdn.net/imust_can/article/details/7064479
- hibernate中的session中的方法(网页资料整理)
- hibernate之session的方法小插曲
- Spring注解方式,异常 'sessionFactory' or 'hibernateTemplate' is required的解决方法 转载的
- Hibernate_Session核心方法
- js window对象属性和方法相关资料整理
- Hibernate5-进阶添加工具类,对获取Session的方法封装
- hibernateTemplate 与session的区别 HibernateTemplate、HibernateDaoSupport两种方法实现增删改查
- Hibernate之Session的方法get()与load()的区别
- 注解的力量 -----Spring 2.5 JPA hibernate 使用方法的点滴整理(二):进一步消除 hibernate.cfg.xml
- Hibernate session.get()和session.load()方法的区别
- Session在ASP.NET中的应用资料整理
- 【旧资料整理】c\c++两种定义字符串数组方法内存开销比较
- Hibernate session的方法全集
- hibernate中session的flush()方法个人浅见
- Hibernate资料整理
- Hibernate_操作对象_对象的状态分类、Session中的方法概述
- 利用hibernate的session查询数据库,而且在jsp页面显示表内容的方法
- org.hibernate.Session常用方法的作用总结
- 打开session的方法和org.hibernate.HibernateException: No CurrentSessionContext configured! 异常