1、实体bean:学生表xgStudent,班级表xgClass.学生表xgStudent中有字段bjid存放xgClass的主键。

实体Bean如下:

xgStudent【xsid为主键】:

package bean;

public class xgStudent {
	public int xsid;
	public xgClass bjid;
	public String xsxm;
	public xgStudent(int xsid,xgClass bjid,String xsmx){
		this.xsid = xsid;
		this.bjid = bjid;
		this.xsxm = xsxm;
	}
	public int getXsid() {
		return xsid;
	}
	public void setXsid(int xsid) {
		this.xsid = xsid;
	}
	public xgClass getBjid() {
		return bjid;
	}
	public void setBjid(xgClass bjid) {
		this.bjid = bjid;
	}
	public String getXsxm() {
		return xsxm;
	}
	public void setXsxm(String xsxm) {
		this.xsxm = xsxm;
	}
	
	
}

xgClass【bjid为主键】:

package bean;

public class xgClass {

	public int bjid;
	public String bjmc;
	
	public xgClass(int bjid,String bjmc)
	{
		this.bjid = bjid;
		this.bjmc = bjmc;
	}

	public int getBjid() {
		return bjid;
	}

	public void setBjid(int bjid) {
		this.bjid = bjid;
	}

	public String getBjmc() {
		return bjmc;
	}

	public void setBjmc(String bjmc) {
		this.bjmc = bjmc;
	}
	
	
}


2、ibatis的xml配置文件:xg_Student.xml中配置xgStudent别名时对于bjid字段调用了xg_Class.xml中的selectInfoById进行查询,代码如下:

【后续补充】

xg_Student.xml:




xg_Class.xml:





3、在对学生表xgStudent进行操作时,对于班级信息xgClass可以不进行选择,主要的设计逻辑为:

页面提交学生数据-》action获取页面数据-》service-》ibatis的insert语句

数据更新到数据库中对于bjid字段的值为0.这里是因为xgClass中的主键为int类型,不选择时默认为0.


基于新增的逻辑,出问题的地方就在于修改前的查询,修改前的查询action中获取到的xgStudent.bjid实际上是空对象,判断方法如下:

if(String.valueOf(xgStudent.getBjid())!=null)

这行代码也是整个问题的核心,一直以来使用String.ValueOf()一直自认为返回对象默认为“null”字符串,但是通过这个使用环境发现,返回的是null对象。所以这里的判定是比较特殊的

做了下功课,发现String.valueOf被重载了多次。其中一个比较特殊的方法是:

①:

public static String valueOf(char data[]) {    
    return new String(data);
}

再看String对象的构造函数:

  1. public String(char value[]) {  

  2.     this.offset = 0;  

  3.     this.count = value.length;  //※  

  4.     this.value = StringValue.from(value);  

  5.     }  


②:

  1. public static String valueOf(Object obj) {  

  2.     return (obj == null) ? "null" : obj.toString();  

  3.     } 

在调试代码中watch修改前action中xgStudent.getBjid()并不为null对象或“null”字符串。而是一个xgClass对象,对象中的bjid字段为0.这里判定调用的是②的ValueOf

()方法。需要验证下xgClass对象中是否重载了toString()【后续补充】



4、步骤3中更多是对目前解决方案的猜测,需要后续验证。目前项目还可以采取另一种方式:

在插入xgStudent数据中,action在获取到页面内容后,判定是否选择,未选,则将xgClass置为null,代码如下:

xgStudent.setBjid(xgStudent.getBjid()!=0?xgStudent.getBjid()?null);

然后再将xgStudent插入到数据库中,此时从数据库中看到该条记录的bjid则为空对象;【步骤3中操作后,数据库显示值为0】

这种方式的操作,在修改前的查询到xgStudent对象中的bjid则为空

判定则更改为:

if(!String.valueOf(xgStudent.getBjid()).equals("null"))



步骤3、步骤4实现效果是一样的,步骤3需要进一步验证原理