一:Session
openSession() 和getCurrentSession():
getCurrentSession() 如果现在有session,从现有的取一个
hibernate.current_session_context_class:配成 thread
是以一个连接为事务管理的边界
二:对象3种状态:
1.Transient 瞬时状态:(刚new出来) 内存中创建对象,没有分配ID(后边都有指定的ID)2.Persistent 持久化:(save后) 从序列分配,内存中有对应项被session管理
3.Detached 脱离管理:(commit后) 放到数据库中,内存中的对象没人用了,等待被回收
状态转换如下图所示:
三:增删改查
1.save
2.delete
Teacher t = new Teacher(); t.setTeacherid(21); session.delete(t);
3.load和get
load返回代理对象:
Teacher t = (Teacher)session.load(Teacher.class,22); //主键,取出是Persistent状态load时候没去数据库取值,而是生成一个代理,直到用的时候才会去去取
load完没用就把session关掉,之后再用的话就会报延迟加载的错误:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
get马上回去数据库取值
Teacher t = (Teacher)session.get(Teacher.class,22);
4.update
Teacher t = new Teacher(); t.setTeacherid(22);//指定主键 t.setAge(73); session.update(t);更新Detached的对象,改一个字段也会全部更新(不想更新的字段@Column(updatable=false))
get出来的Persistent对象,修改后hibernate会帮忙更新
merge()方法,合并参数进数据库,没有变动的不用改(先select去load出来,再改要改的)
推荐用HQL解决
5.saveOrUpdate
自动判断是该save还是update6.clear
清除已经查询到的缓存7.flush()
强制同步一下数据库和缓存四:SchemaExport
打印完整建表语句,显示实际的建表结果:
import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport; //........... @Test public void testShow() { new SchemaExport(new AnnotationConfiguration().configure()).create(false,true); }