hibernate多对一关系,显示、修改、删除、查询、下拉框查询

本文详细介绍了hibernate中多对一关系的配置,包括如何处理外键约束、pojo类的调整以及hbm.xml的映射设置。接着讲解了带有下拉列表的修改操作,如何在显示和修改页面间传递数据,以及在控制器、接口和DAO层实现查询方法。此外,还阐述了多对一关系的删除逻辑,强调了删除一的一方需先删除多的一方。最后,讨论了根据教师名称的模糊查询和下拉框选择查询,涉及ajax的使用和DAO层的查询方法调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1、配置多对一

 教师表中的zc、zjz对应的是字典表中的id。

 

所以外键要放在教师表中,关联外键约束

要关联的主键之间的类型要一致,如教师表中的:zjz、zc,字典表中的id应是一个类型的,否则就会报错,zjz,zc里只能放字典表中id字段里的值,更改类型。zjz、zc要做关联用

pojo类中的Teacher.java中的类型也要做出更改,并修改他的get、set方法

 修改好后多对一的准备工作也就完成了

很多个老师对应一个职称,一个专兼职(多对一)在pojo下:

    因为是多对一所以需要添加这两个属性
    //多对一 ---->Teacher.hbm.xml  并给这两添加get、set方法
    private Dict zcDict;//职称
    private Dict zjzDict;

添加完之后需要在hbm.xml中配置他两的映射方法

//因为zcDict的类型是Dict所以需要一个class   
//column是用来指定外键的id值的 也就是Teacher中用来做外键的字段
//hibernate有懒加载的功能,只有的去调用了它才会去执行
//insert="false" update="false" 在查询表的瞬间就进行锁定不然会报错
<property name="zc" column="zc"></property>
<property name="zjz" column="zjz"></property> 
<many-to-one name="zcDict" class="com.hxci.pojo.Dict" column="zc" insert="false" update="false"></many-to-one>
<many-to-one name="zjzDict" class="com.hxci.pojo.Dict" column="zjz" insert="false" update="false"></many-to-one>

修改显示页面中职称,和专兼职改为新定义的两个属性

<td>'+v.zcDict.value+'</td> <td>'+v.zjzDict.value+'</td>

2、带多对一关系、下拉列表的修改

 我们做的修改和显示不是同一页面的,在点击修改的时候跳转到添加的页面,把添加页面的标题改为修改页面,并要求显示默认值。

我们可以通过传递id的值找到要修改信息, 需要传递一个id到添加页面

//在显示页面添加跳转修改的链接
<a href="teacherAdd.html?'+v.id+'">修改</a>   // 需要传递一个id到添加页面,

到添加页面中

$(function(){
	//通过判断当前的请求地址中是否有id
	var id =(window.location.href).split("?")[1]   
	//alert(id)
	if(id != null){
		$.ajax({	//通过一个ajax 向后台传递i,获取一条数据,并且显示在对应的位置上
		       type: "POST",
		       url: "/ssh_sign0506/tea!queryOne",     
                //不想定义新的变量来进行查询直接使用TeacherController中的 tea
		       data: {"tea.id":id}, //-->String index =null;
		       dataType:"json",
		       async: false,
		       success: function (res) {//res json对象
		    	   
		       },
		     });	
	}

在TeacherController中写查询一条的方法

public class TeacherController {

	TeacherService tservice =new TeacherServiceImpl();
	
	 String flag = "0";
	 List<Teacher> list = null;
	 Teacher tea = new Teacher();   //因为之前起到查询全部的作用有get、set方法,所以这里不需要进行创建

	 public String queryOne(){
		 tea = 	tservice.queryOne(tea);
		return "queryOne";//result标签
	 }
	 

配置result标签

 <action name="tea!*" 
   class="com.hxci.controller.TeacherController"
   method="{1}" >
    <result name="showAll" type="json">
        <param name="root">list</param>
     </result>
      
     <result name="update" type="json">
        <param name="root">flag</param>
     </result>

    <result name="queryOne" type="json">   //配置的标签
        <param name="root">tea</param>
     </result>
    
   </action>

在接口中创建

Teacher queryOne(Teacher tea);

在实现类中创建

public Teacher queryOne(Teacher tea) {
	// TODO Auto-generated method stub
	return tdao.queryOne(tea);
}

在Dao层创建方法

public Teacher queryOne(Teacher tea) {
	//传递过去id并加强制类型转换
	return (Teacher) hibernateSession.get(Teacher.class, tea.getId());
}

在ajax的回调函数中

要给每一个input中的id都重新定义 input中的name属性和id属性是一样的

$(function(){
	//通过判断当前的请求地址中是否有id
	var id =(window.location.href).split("?")[1]   
	//alert(id)
	if(id != null){
		$.ajax({	//通过一个ajax 向后台传递i,获取一条数据,并且显示在对应的位置上
		       type: "POST",
		       url: "/ssh_sign0506/tea!queryOne",     
                //不想定义新的变量来进行查询直接使用TeacherController中的 tea
		       data: {"tea.id":id}, //-->String index =null;
		       dataType:"json",
		       async: false,     //必须是同步查询,不然这个查询完而下拉列表的值却没查询完
		       success: function (res) {//res json对象
                    //因为是input所以是val,其他类型用text
		    	    $("#id").val(res.id);
		    	    $("#jj").val(res.jj); 
		    		$("#tel").val(res.tel);
		    		$("#name").val(res.name);
		    		$("#zcop").val(res.zc);      //给下拉列表加默认值
		    		$("#loginName").val(res.loginName);
		    		$("#password").val(res.password);
		       },
		     });	
	}

在添加页面添加一个隐藏域  在<form></form>中添加一个input

 <form class="form-x" id="form" >  
     <input  id="id" type="hidden" name="tea.id">    //添加的隐藏域
      <div class="form-group">
        <div class="label">
          <label>登录账号:</label>
        </div>
        <div class="field">
          <input  id="loginName" type="text" class="input w50" value="" name="tea.loginName" data-validate="required:请输入教师名称" />
          <div class="tips"></div>
        </div>
      </div>

点击修改的页面要显示出下拉列表的默认值

把显示下拉条的ajax方到修改ajax的下方,让他先查询一条,再查询下拉列表

给下拉列表的input添加id

 <div class="field">
      <input  id="zcop" type="hidden" >     //添加的id隐藏域
      <select  id="zc" name="tea.zc" class="input w50">
      <option value="">请选择</option>
      <option value="1">教授</option>

$.ajax({
	       type: "POST",
	       url: "/ssh_sign0506/dict!showTea",     
	       dataType:"json",
	       success: function (res) {
	    		console.log(res);
	    		//先显示职称的下拉列表
	    		var zopt='';
	    		$("#zc").empty();
	    		$.each(res.zc,function(i,v){
                    //查询下拉框   是否有默认值
	    			var ck ="";          
	    			if(v.id==$("#zcop").val() ){
	    				ck ="selected"
	    			}
	    			//alert(ck)
	    			zopt = zopt + '<option '+ck+' value="'+v.id+'">'+v.value+'</option>'
	    		});
	    		
	    		$("#zc").append(zopt);
	    		//再显示专兼职的下拉列表
	    		var jzopt='';
	    		$("#zjz").empty();
	    		$.each(res.jz,function(i,v){
	    			jzopt = jzopt + '<option value="'+v.id+'">'+v.value+'</option>'
	    		});
	    		$("#zjz").append(jzopt);
	       },
	       error: function(data) {
	         alert("系统出现异常")
	       }
	 });

3、删除

多对一的删除

删除多的那一方对没有任何影响,删除一的那一方需要先删除多的那一方

如:班级和学生表,直接删除学生表中的信息是不会有影响的,但要是想要删除班级表中的班级值时,需要先删除学生表后才可以删除班级表中的值

在显示页面做信息的删除

//在显示页面的拼接字段中添加删除方法的超链接
//需要往后台中传递的是一个id,用id来进行删除
<a href="javascript:del('+v.id+')">删除</a>

书写删除方法的ajax

function del(a){
	//alert(a);
	$.ajax({	//通过一个ajax 向后台传递i,获取一条数据,并且显示在对应的位置上
	       type: "POST",
	       url: "/ssh_sign0506/tea!del",     
	       data: {"tea.id":id}, //-->String index =null;
	       dataType:"json",
	       success: function (res) {//res json对象
	    	   if(res == '1'){
	        		 alert("删除成功");
		        	//重新查询   
		        	window.location.href="teacher.html";
	    	    }
	       },
	       error: function(data) {
	         alert("系统出现异常")
	       }    
	       },
	     });	
}

在TeacherController书写删除的方法,我们

 public String del(){
         //在这个tea中只有id是有值的因为在ajax中我们只传递了id的值
		tservice.del(tea);  
		flag = "1";
		return "update";
 }

接口中创建方法

void del(Teacher tea);

实现类中创建方法

public void del(Teacher tea) {
	// TODO Auto-generated method stub
	tdao.del(tea);
}

 在Dao层中创建方法

public void del(Teacher tea) {
	// TODO Auto-generated method stub
	hibernateSession.delete(tea);
	hibernateSession.beginTransaction().commit();
}

4、查询

根据教师名称进行模糊查询

1.点击搜索按钮的时候触发一个事件

2.在事件当中获取到输入框的值,

3.用ajax作为参数,把值传递到后台

4.后台根据传递过来的值进行一个条件查询的Dao层方法

5.把查询到的值返回到前台

以上就是做查询一条的思路(条件查询)

在页面中找到搜索的按钮

<a href="javascript:void(0)" class="button border-main icon-search" onclick="namesearch()" > 搜索</a></li>

有定义οnclick="namesearch()",所以直接在下面定义方法名就可以

<input id="iname"  type="text" placeholder="请输入教师名称" name="keywords" class="input" style="width:250px; line-height:17px;display:inline-block" />
<a href="javascript:void(0)" class="button border-main icon-search" onclick="namesearch()" > 搜索</a></li>

 需要给显示方法添加一个隐藏域

$(function(){
	show();
});

function show(){
	//查询的ajax
	$.ajax({
	       type: "POST",
	       url: "/ssh_sign0506/tea!showAll",     
	       dataType:"json",
	       success: function (res) {
	    		if(res != null && res.length>0 ){
	    			var _tr ='';
	    			$("#tb").empty();//先清空列表
		    		$.each(res,function(i,v){//每循环一次数组的时候 拼接一条html代码
		    			_tr = _tr +'<tr><td width="100" style="text-align:left; padding-left:20px;">'+v.name+'</td><td>'+v.tel+'</td> <td>'+v.zcDict.value+'</td> <td>'+v.zjzDict.value+'</td> <td width="10%">'+v.jj+'</td> <td width="310"><a href="teacherAdd.html?'+v.id+'">修改</a>|<a href="javascript:del('+v.id+')">删除</a></td> </tr>';
		    		});
		    	    $("#tb").append(_tr);	//在循环结束之后将拼接后的html追加到根节点(列表)	    		
	    		}		
	       },
	       error: function(data) {
	         alert("系统出现异常")
	       }
	 });
}

 搜索框的条件查询

function namesearch(){
	show();
}

写到function show()方法中

//val要获取输入框的值 iname是输入框的id
var name=$("#iname").val();       //获取隐藏域的值进行判断

 无论你是否传递了值,都要进行查询

//在显示的ajax中写入
data:{'tea.name':name},   //把搜索框中的name传递过去
	       

在TeacherController中有查询的方法,如果想要在这个查询的方法里接收变量,需要通过get、set方法来进行接传值,所以可以把tea作为参数来进行传递

TeacherService tservice =new TeacherServiceImpl();
String flag = "0";
List<Teacher> list = null;
Teacher tea = new Teacher();
public String showAll(){
	list = tservice.showAll(tea);   //添加的tea进行传递
	return "showAll";
}

因为之前没有给show添加参数,需要在接口中给这个方法添加参数

//添加前
List<Teacher> showAll();
//添加后          
List<Teacher> showAll(Teacher tea);

在他的接口的实现类中也会报错给这个方法添加参数

//添加前
public List<Teacher> showAll() {
	// TODO Auto-generated method stub
	return tdao.showAll();
}
//添加后
public List<Teacher> showAll(Teacher tea) {   //定义一个方法需要指定一个类型
	// TODO Auto-generated method stub 
	return tdao.showAll(tea);                 //掉方法是传参数,需要把变量放入  
}

在Dao层中需要改变这个方法

//改变前
public List<Teacher> showAll() {
    // TODO Auto-generated method stub
	return  hibernateSession.createQuery("from Teacher").list();
}
//改变后
public List<Teacher> showAll(Teacher tea) {
	// TODO Auto-generated method stub
	return  hibernateSession.createQuery("from Teacher").list();
}

用hibernate的模糊查询

//   类名          属性名 
from Teacher where name

ajax中的tea要和Controller里的tea一致

 

 

showAll中的查询方法

public List<Teacher> showAll(Teacher tea) {
		String hql = "from Teacher where name like :nam";
		//调用session获取数据库类表的方法,传递hql查询语句
		Query query = hibernateSession.createQuery(hql);
		query.setString("nam","%"+tea.getName()+"%");
		List<Teacher>list = query.list();   //
		// TODO Auto-generated method stub
		return  query.list();
	}

5、下拉框查询

直接把添加页面的下拉列表ajax复制过来,进行修改写入显示页面的隐藏域中

//页面加载的时候进行查询
$(function(){
	show();
	$.ajax({
	       type: "POST",
	       url: "/ssh_sign0506/dict!showTea",     
	       dataType:"json",
	       success: function (res) {
	    		//先显示职称的下拉列表
	    		$("#zc").empty();   //先清空类表
	    		var zopt='<option value="">请选择</option>';
	    		$.each(res.zc,function(i,v){
	    			zopt = zopt + '<option value="'+v.id+'">'+v.value+'</option>'
	    		});
	    		$("#zc").append(zopt);
	       },
	       error: function(data) {
	         alert("系统出现异常")
	       }
	 });
	

});

 在下拉列表选择完后,点击查询

获取下拉列表的值,传递过去的不是副教授这三个字,是字典表中副教授的id,也就是value的值。

定义变量sa,ajax中要传递的值需要添加一个zc

function show(){
	//val要获取输入框的值 iname是输入框的id
	var na=$("#iname").val();   //在页面加载时就开始进行模糊查询
    //val要获取下拉列表的值 zc是下拉列表的id
	var zc=$("#zc").val();
    $.ajax({
	       type: "POST",
	       url: "/ssh_sign0506/tea!showAll",     
	       data:{'tea.name':na,'tea.zc':zc},   //把搜索框中的name传递过去
	       dataType:"json",
	       success: function (res) {
	    	   $("#tb").empty();//先清空列表
	    		if(res != null && res.length>0 ){
	    			var _tr ='';
		    		$.each(res,function(i,v){//每循环一次数组的时候 拼接一条html代码
		    			_tr = _tr +'<tr><td width="100" style="text-align:left; padding-left:20px;">'+v.name+'</td><td>'+v.tel+'</td> <td>'+v.zcDict.value+'</td> <td>'+v.zjzDict.value+'</td> <td width="10%">'+v.jj+'</td> <td width="310"><a href="teacherAdd.html?'+v.id+'">修改</a>|<a href="javascript:del('+v.id+')">删除</a></td> </tr>';
		    		});
		    	    $("#tb").append(_tr);	//在循环结束之后将拼接后的html追加到根节点(列表)	    		
	    		}		
	       },
	       error: function(data) {
	         alert("系统出现异常")
	       }
	 });
}

在Dao层中showAll方法中需要再做一次的修改,也就是需要再递一个值到数据库中好进行查询

修改好后的showAll方法

public List<Teacher> showAll(Teacher tea) {
		String hql = "from Teacher where name like :nam ";
		StringBuffer buffer = new StringBuffer(hql);

		//判断zc是否有值传递过来如果不为null 不为空字符串就需要对数据库进行查询
		if(tea.getZc()!=null && !tea.getZc().equals("")){
			//这是个字符串拼接的语句,需要有空格才能在数据库中进行查询
			buffer.append(" and zc=:zc");
		}

		//调用session获取数据库类表的方法,传递hql查询语句
		Query query = hibernateSession.createQuery(buffer.toString());
		query.setString("nam","%"+tea.getName()+"%");

		if(tea.getZc()!=null && !tea.getZc().equals("")){
			query.setInteger("zc",tea.getZc());
		}
		List<Teacher> list = query.list(); 
		return  query.list();
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值