1.设置外键group:id,namestudent:id,name,g_id想让哪方有外键就把@JoinColum(name=外键名称/即:主表id)注解在哪方(即:从表中)privateStudent引用名;//省略get,set方法在getter方法上面进行注解@manytoone@joinColumn(name=)2.设置级联属性在拥有外键的表(即student实体中)对应的实体的一端书写cascade=CascadeType.ALL属性,然后进行session.seve(student)时,就可以进行级联,而不必须去关心另一个实体的cascade=CascadeType.ALL属性3一对多:只有一对多是把joincolumn写在多的一方,其他一对一或者多对多可以随便写3.多对多:1.cascade=CascadeType.ALL级联属性和joincolumn要写在同一个类中,但是不能写joincolumn,不能写joincolumn,只能写jointableEg:@JoinTable(name=t_s,joinColumns={@JoinColumn(name=s_id)},inverseJoinColumns={@JoinColumn(name=t_id)})15:242012/3/135.目前,持久化规范要求多的一方为关系维护端,一的一方为关系被维护端,可以再one方的@onetomany注释设置mappedBy属性,以指定它是这一关联关系的被维护端,many方为关系维护端。mappedBy的功能为:不用再在这方再重新建立连接,一切遵从另一方,这样可避免冗余关于mappedBy的含义:1.只有onetoone,onetomany,manytomany上才有mappedBy属性,manytoone不存在该属性。2.mappedBy标签一定是定义在theownedside(mappedBy为被拥有方。被拥有方的),他指向theowningside(拥有方)。3.mappedBy的含义,应该理解为,拥有方能够自动维护跟被拥有方的关系当然,如果从被拥有方,通过手工强行来维护拥有方的关系也是可以做到的4.mappedBy跟joincolumn、jointable总是处于互斥的一方,可以理解为正是由于拥有方的关联被拥有方的字段存在,拥有方才拥有了被拥有方。mappedBy这方定义的joincolumn/jointable总是失效的,不会建立对应的字段或表。6.1.拥有外键的是主表,主表里面有一个字段指向从表里面的主键,所以删除时只能删除主表(student),才能删除从表(group),不然从表不能删除。2.一对一关联可能是双向的.在双向关联中,有且仅有一端是作为主体(owner)端存在的:主体端负责维护联接列(即更新).对于不需要维护这种关系的从表则通过mappedBy属性进行声明.mappedBy的值指向主体的关联属性.在上面这个例子中,mappedBy的值为wf.最后,不必也不能再在被关联端(ownedside)定义这列了,因为已经在主体端进行了声明.4.如果在主体没有声明@JoinColumn,指定外键的名称,则系统自动进行处理:在主表(ownertable)中将创建联接列,列名为:主体的关联属性名+下划线+被关联端的主键列名.9.mappedBy的功能为:不用再在这方再重新建立连接,一切遵从另一方,这样可避免冗余(1).设置外键想让哪方有外键就把@JoinColum(name=外键名称/即:主表id)注解在哪方(即:从表中)private主表类名引用名;//省略get,set方法在get方法上面进行注解@manytoone@joinColumn(2).设置级联操作方级联来保存多方数据,你想通过哪方来保存数据,则在哪方处理关联关系,并设置cascadeType=CascadeType.ALL和fetch=FetchType.Lazy(3)@JoinColumcascadeType=CascadeType.ALL和fetch=FetchType.Lazy三者在一起------有外键,从表mappedBy(name=)------主表mappedBy(name=)与@JoinColum不能放在一起,即:分别放在有关系的两个实体中(4)/**级联保存**想通过哪方来级联保存数据,则在哪方设置关联关系,并设置级联**在student类中处理关联关系,并设置cascade=CascadeType.ALL*/@TestpublicvoidtestSave(){Sessionse=HibernateUtil.getSession();Transactiontx=se.beginTransaction();Teachert=(Teacher)se.get(Teacher.class,3);Students=(Student)se.get(Student.class,2);s.getTs().add(t);try{se.save(s);tx.commit();}catch(Exceptionex){tx.rollback();ex.printStackTrace();}}/**往数据库中填数据*/@Testpublicvoidsave(){Sessionse=HibernateUtil.getSession();Transactiontx=se.beginTransaction();Teachert1=newTeacher();t1.setName(1234);Teachert2=newTeacher();t2.setName(2345);Students=newStudent(s1);s.getTs().add(t1);s.getTs().add(t2);try{se.save(s);tx.commit();}catch(Exceptionex){tx.rollback();ex.printStackTrace();}}/**级联保存**想通过哪方来级联保存数据,则在哪方设置关联关系,并设置级联**在teacher类中处理关联关系,并设置cascade=CascadeType.ALL*/publicvoidtestSaveOther(){Sessionse=HibernateUtil.getSession();Transactiontx=se.beginTransaction();SetStudentss=newHashSetStudent();ss.add(newStudent(s0));ss.add(newStudent(s2));ss.add(newStudent(s3));Teachert3=newTeacher(t1);t3.setSs(ss);try{se.save(t3);tx.commit();}catch(Exceptionex){tx.rollback();ex.printStackTrace();}}/**级联修改*/@TestpublicvoidtextUpdate(){Sessionse=HibernateUtil.getSession();Transactiontx=se.beginTransaction();try{Teachert=(Teacher)se.get(Teacher.class,2);Students=(Student)se.get(Student.class,1);s.getTs().add(t);se.save(s);System.out.println(先生+t.getName()+的学生为:);for(Studentstudent:t.getSs()){System.out.println(student.getName());}tx.commit();}catch(Exceptionex){tx.rollback();ex.printStackTrace();}finally{}}/**级联删除不级联删除*/@TestpublicvoidtestDelete(){Sessionse=HibernateUtil.getSession();Transactiontx=se.beginTransaction();try{Students=(Student)se.get(Student.class,2);s.setTs(null);se.delete(s);tx.commit();}catch(Exceptionex){tx.rollback();ex.printStackTrace();}}10.session缓存(一级缓存)Hibernate的缓存包括session缓存和sessionFactory缓存,其中sessionFactory缓存又可以分为两类,内置缓存和外置缓存。Session的缓存是内置的,不能被卸载,也被称为hibernate的第一级缓存。sessionFactory的外置缓存也被称为hibernate的第二级缓存。当hibernate根据id访问数据对象的时候,首先从session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查,查不到,再查询数据库,把结果按照id放入缓存。。1)它是轻量级的类在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都不会占用很多资源。这在实际项目中确实很重要,因为在客户程序中,可能会不断地创建以及销毁Session对象,如果Session的开销太大,会给系统带来不良影响。(2)但它是非线程安全的值得注意的是Session对象是非线程安全的,因此最好是一个线程只创建一个Session对象(将它设计为局部对象)。(3)publicstaticfinalThreadLocalthreadLocal=newThreadLocal();pulicstaticSessioncurrentSession(){SessioncurrentSession=(Session)threadLocal.get();if(currentSession==null){currentSession=sessionFactory.openSession();threadLocal.set(currentSession);}returncurrentSession;}(4)第二缓存为数据库(5)一级缓存session,二级缓存db查询数据时,系统会自动先查找第一缓存即session,如果找到,则直接返回,不会经过数据库,如果没有,则再去数据库中查找.(6)配置配置文件hibernate-cfg.xml(a)使用注解方式,则使用来AnnotationConfiguration创建连接,配置实体类mappingclass=com.model.Student/(b)使用xml,类名.hbm.xml则使用Configuration.配置实体类的配置文件mappingresource=com/model/student.xml/(实体类的配置文件取名与实体类相同,除首字母小写外,例:实体类Student,其配置文件student.hbm.xml)(7)getCurrentSession()获得正在运行的session使用getCurrentSession()时,要在配置文件hibernate-cfg.xml中进行配置,propertyname=current-session-context_classthread/property(8)session缓存openSession()为打开一个session缓存,所以各不相同SessionFactorysf=newAnnotationConfiguration().configuration().bulitSessionFactory();Sessions1=sf.openSession();Sessions2=sf.openSession();g