一.三种对象状态
transient:内存中有一个对象,没有id,缓存中也没有
persistent:内存中有,缓存中有,数据库中有(id)
detached:内存中有,缓存中没有,数据库中有id
二.CoreAPI
1.configure读取hibernate.cfg.xml文件
2.load与get功能都是从数据库中查找
区别:
1.load返回的时代理对象,等到真正的用到对象的内容时才会发出sql语句
2.get直接从数据库加载,不会延迟,直接发出sql语句。
3.clear方法:
无论时get还是load,都会首先查找缓存(一级缓存),如果没有,才会
从数据库查找,调用clear()方法可以强制清楚session缓存
4. flush方法:
强制缓存和数据库同步。
5.delete()
transient:内存中有一个对象,没有id,缓存中也没有
persistent:内存中有,缓存中有,数据库中有(id)
detached:内存中有,缓存中没有,数据库中有id
在拥有id号的时候据可以delete
5.update
/**
*persistent中的对象修改,如果和之前的值相同,不会发送update语句
*如果不同则会发送update语句,而且所有的字段都会更新。
*更新部分字段:
*1.在xml文件中设置property中update属性中设置false,或者annotation中设置
* @Column的updatable属性(不灵活)
*2.修改hbm.xml文件在class标签中添加 dynamic-update
* 如果跨session的使用merge(合并)方法,merge通过对比数据库中是否更新,
* 会再一次select一个数据库很繁琐。
*3.使用sql语句,session调用crateQuery方法(方法中使用sql语句)创建一个Query对象,
* 再调用executeUpdate方法。(建议使用)
*/
@Test
public void UpdateTest2(){
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("Update Teacher s set s.name='z5'where id =1");
q.executeUpdate();
session.getTransaction().commit();
}
三.getSession和getCurrentSession
openSession()永远创建新的session要close 而getCurrentSession();可能会打开新的也会拿
原来已经存在的,session没提交的话就一直是原来那个。
可以用来界定事务边界,事务提交自动close
使用getCurrentSession()需要在hibernate.cfg.xml文件中配置
<property name="hibernate.current_session_context_class">thread</property>
thred值是在一个单独的需要进行JDBC连接的java application中运行hibernate
jta值则是两个不同的数据库而且有application server时使用