java SSH第一章学习内容(Hibernate多表查询,延迟加载,OpenSessionInView)

一.一对多,多对一查询
例:县区表和街道表的查询

District(县区) 表:


Street(街道)表:


1.利用自动生成的DAO里面进行修改
2.获得session
3.使用session.get方法获取类反射
4.对数据进行增删改查操作


1.查询黄埔大道属于什么区
public void Select(){
        Session session =super.getSession();
        District ds = (District) session.get(District.class,(short)1);
        Set st = ds.getStreets();
        Iterator<Street> it = st.iterator();
        while(it.hasNext()){
            Street jd=it.next();
            System.out.println(jd.getName()+jd.getDistrict().getName());
        }
        session.close();
    }

2.通过街道获取县区
    public void Select2(){
        Session session =super.getSession();
        Street st =(Street)session.get(Street.class,(short)1);
        System.out.println(st.getName()+st.getDistrict().getName());
        session.close();
    }

3.新增县区
    public void insert1(){
        Session session =super.getSession();
        District ds = new District();
        ds.setName("黄浦区");
        session.beginTransaction();
        session.save(ds);
        session.getTransaction().commit();
        session.close();
    }

4.新增县区并添加街道
    public void insert2(){
        Session session=super.getSession();
        District ds = (District) session.get(District.class,(short)1);
        Street st = new Street();
        st.setName("中山大道");
        st.setDistrict(ds);
        session.beginTransaction();
        session.save(st);
        session.getTransaction().commit();
        session.close();
    }

5.删除街道从表数据
    public void delete1(){
        Session session=super.getSession();
        Street st = (Street) session.get(Street.class,(short)3);
        session.beginTransaction();
        session.delete(st);
        session.getTransaction().commit();
        session.close();
    }

6.删除县区并把所属街道也删掉
    public void delete2(){
        Session session =super.getSession();
        District ds = (District) session.get(District.class, (short)3);
        session.beginTransaction();
        session.delete(ds);
        session.getTransaction().commit();
        session.close();
    }

7.修改街道的ID成县区的ID
    public void update1(){
        Session session=super.getSession();
        Street st=(Street) session.get(Street.class,(short)2);
        District dt=(District) session.get(District.class,(short)2);
        session.beginTransaction();
        st.setDistrict(dt);
        session.getTransaction().commit();
    }


二.延迟加载
概念:查询一张表,如果不设置延迟加载就会查询该表有关联的其他表并进入内存,如需使用延迟加载需在xml.配置文件中设置
1.普通属性延迟加载(一般没用),所有属性都会延迟,写配置文件中在class后面 lazy="true"
2.部分延迟加载    写在set标签后面 lazy="xx";
//false所有都不延迟加载,true延迟加载xx.getxx().size再加载,extra超强延迟加载
3.代理延迟加载    设置在many to one标签  lazy="xx"
//false所有都不延迟加载,proxy(代理)延迟加载xx.getxx().size再加载,no-proxy(不代理)超强延迟加载



 

三.OpenSessionInView
概念:可以作用与过滤器负责调用Session,每次调用DAO方法就不用自己手动调用get.Session();
1.创建一个类并实现接口 Filter
2.修改dofilter方法,参考代码如下:

Configuration cg =new Configuration().configure();
SessionFactory factory=configuration.buildSessionFactory();
Session session=factory.openSession();
session.beginTransaction();
arg2.doFilter(arg0,arg1);
session.getTranction().comfig();

注:通过web.xml进行配置监听器

猜你喜欢

转载自blog.csdn.net/JayVergil/article/details/81986722