2018-10-15:级联操作与类型转换

级联操作

@OneToMany(mappedBy="teacher")
@Cascade(value={CascadeType.DELETE})
Query query = session.createQuery("update teacher set birthday = ? 

,imgsrc = ? ,tdesc = ? where tno = ? ");
query.setDate(0,teacher.getBirthday());
query.setStirng(1,teacher.getImgsrc());
query.set   ...
  • 级联操作:persistent update delete none all
    新增 修改 删除
  1. 级联新增 当新增主键(外键)对象的时候 如果关联了还未保存到数据

的外键(主键)对象,就一并保存例如 新增一个班级的时候,顺便把第一个

学生添加了新增加一名学生发现这个学生所在的班级还不存在,顺便把班级

也添加了

  1. 级联修改 当主键表修改了主键,外键表原来的对应的外键字段就不合法

了,需要一并修改

  1. 级联删除 当删除一条主键,同时把该主键对应的外键删除了
  • 如果一个类的操作,不想级联操作产生
  1. 关系编写mappedBy 表示级联由对方操作,但是由于不能双方都写

mappedBy如果另外一方有修改不操作级联的时候,就只能直接编写sql语句
2.自己编写sql语句

  • 不合理级联产生的原因
  1. 对象查询开启了延迟加载,所以在只修改自身基本的属性的时候,没有将

关联数据查询
查询teacher由于延迟加载 clazzs为空

  1. 修改这个对象所带的关联对象是空的,所以这个时候做级联将原来的关联

删除
保存teacher,clazzs为空 所以 级联操作认为这个教师没有班级,所

以将原来班级的外键全部修改为null

  • hibernate的设定,修改自己本身属性 自己编sql语句,维护关联关系使用

update()或者merge方法

  • 以修改学生信息为例
  1. 管理员审核学生有个页面 (修改状态字段) updateState(){编

写sql语句}

  1. 学生修改如联系电话等基本属性有个页面(修改电话 家庭住址等字段)

updateInfo{编写sql语句}

  1. 学生修改密码页面 (修改密码字段)updatePwd(){编写sql}
  2. 学生修改选课 (修改关系,通过新增和删除 修改sc选课表中的记录

) updateSelectCourse{调用update()或者merge方法}

  • 在真正需要修改关联关系的时候,需要给对象配置好关联集合,需struts

输出和接受接受值的时候 将对象转换为 对象主键集合 ,将对象主键 转换

为对象,内容见struts相关内容。

类型转换

在基础的web处理中,如果页面提交的内容(默认全部为String),但需要

对应的填入 int Date 等类型,需要编写类型转换代码
struts内置了基础的类型转换器,所以基础类型不需要配置自动转换
struts 也可以自定义配置集合类型转换器
例如 教师 带 班,修改教师带班,页面上其实也只有String
Teacher clazzs(集合为 teacher成员变量)

手动类型转换

1.struts默认不支持 List Set 这类的集合自动转换 需要配置类型转换器(

暂时没有讲,需要深刻理解 范型 和 反射机制)
2.页面只能传递 字符串(基本数据类)或者基本类型数组自动注入到

  • 标签的name和strust成员变量对应
   
  • 改造成员变量的 get set方法(
  1. 因为关联对象 是集合,而struts页面标签能够和数组自动匹配,显示的

时候把集合变数组(get)

    public String[] getCnos() {
        List clazzs = teacher.getClazzs();
        int size = clazzs.size();
        cnos = new String[size];
        for(int i = 0 ;i< size;i++){
            cnos[i] = clazzs.get(i).getCno();
        }
        return cnos;
    }
  1. hibernate又只认对象,保存修改的时候 需要把数组变集合)

//数组变集合,hibernate 只认对象集合

    public void setCnos(String[] cnos) {
        this.cnos = cnos;
        clazzs = new ArrayList();
        for(String cno:cnos){
            Clazz clazz = new Clazz();
            clazz.setCno(cno);
            clazzs.add(clazz);
        }
        //struts自己的调用顺序
        //teacher.setClazzs(clazzs); 
    }
  1. 将集合关联给 对象 操作数据库,级联修改(前提 自己控制级联关系要

写joinColumn,不能写mappedBy 是表示把关系给别人控制)

    // 修改一个教师
    public String updateTeacher() {
        teacher.setClazzs(clazzs);//在这写保证赋完值才 执行

操作数据库
        Serializable result = 

teacherServiceI.updateTeacher(teacher);
        return "updateSuccess";
    }
  1. hibernate 先取对象,去掉原来的关联对象,关联新的对象集合后进行修


//取得原来的一,去掉原来一的关系,设置新的关系后 修改一

Teacher resultTeacher = getTeacherByTno(teacher.getTno());
        //将页面传递过来的teacher对应的最新班级集合 赋值给关联的

teacher
         resultTeacher.getClazzs().removeAll

(resultTeacher.getClazzs());
         for(Clazz clazz:teacher.getClazzs()){
             resultTeacher.getClazzs().add(clazz);
         }
  1. 页面设置 注意form给主键
  
  ${teacher.tname}教师,您所带的班级有
  ${fn:length(teacher.clazzs)}//访问具体属性会发送sql语句
    
    
  
  
  
  
  
  1. 记得存放request
    ServletActionContext.getRequest().setAttribute("cnos",getCnos());
    关联数据库对象和页面对象:teacher = dbteacher;

页面获取集合的大小是为了让延迟加载去加载关联对象的查询,否则对象会

空指针。

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" 

prefix="fn"%>
  ${teacher.tname}教师,您所带的班级有
  ${fn:length(teacher.clazzs)}
  • 类似的操作:学生修改选课 使用学生级联课程
    快递员取消自己的任务
    任务发布者取消自己的任务

你可能感兴趣的:(2018-10-15:级联操作与类型转换)