碰到一件比较稀奇的事情,找了半天也没有找到原因,百度,google都查过了,找不到,特来此发帖求助其实是一个很简单的方法:
package com.bestride.services.dao.hibernate;import java.util.ArrayList;
import java.util.List;import com.bestride.services.entity.PlayerTaxCodeBean;public class PlayerTaxCodeDao extends BaseDaoHibernate { @SuppressWarnings("unchecked")
public List getInfoList(Object obj){
PlayerTaxCodeBean bean = (PlayerTaxCodeBean)obj;
List<PlayerTaxCodeBean> beanList = new ArrayList<PlayerTaxCodeBean>();

String sql = "from "+ bean.getClass().getName()+" bean where bean.player_code='"+bean.getPlayer_code()+"'";
System.out.println("before find-------------------------------");
beanList = this.getHibernateTemplate().find(sql);                        //用此句会导致Bean被update
System.out.println("after find-------------------------------");

return beanList;
}
}
这是我的一个Dao类,其中父类BaseDaoHibernate是继承HibernateDaoSupport类的,问题就出在我注释的这一行
执行结果
before find-------------------------------
Hibernate: select playertaxc0_.CODE as CODE, playertaxc0_.player_code as player2_15_, playertaxc0_.tax_code as tax3_15_, playertaxc0_.tax_rate as tax4_15_, playertaxc0_.city_rate as city5_15_, playertaxc0_.edu_rate as edu6_15_, playertaxc0_.localedu_rate as localedu7_15_, playertaxc0_.flower_rate as flower8_15_, playertaxc0_.corp_rate as corp9_15_, playertaxc0_.person_rate as person10_15_, playertaxc0_.use_flag as use11_15_ from PLAYER_TAXCODE playertaxc0_ where (playertaxc0_.player_code='00000000000000000111' )
Hibernate: update PLAYER_TAXCODE set player_code=?, tax_code=?, tax_rate=?, city_rate=?, edu_rate=?, localedu_rate=?, flower_rate=?, corp_rate=?, person_rate=?, use_flag=? where CODE=?
Hibernate: update PLAYER_TAXCODE set player_code=?, tax_code=?, tax_rate=?, city_rate=?, edu_rate=?, localedu_rate=?, flower_rate=?, corp_rate=?, person_rate=?, use_flag=? where CODE=?
after find-------------------------------如果看的不太清楚,我简化一下
before find-------------------------------
Hibernate: select playertaxc0_.CODE as CODE ……(中间省略若干as语句)…… where (playertaxc0_.player_code='00000000000000000111' )
Hibernate: update PLAYER_TAXCODE set ……(中间省略若干赋值语句)…… where CODE=?
Hibernate: update PLAYER_TAXCODE set ……(中间省略若干赋值语句)…… where CODE=?
after find-------------------------------这里select和update语句操作的是同一张表player_taxcode那么,问题来了。
为什么会执行update??????代码中根本没有这个操作啊
(执行两次是因为查询结果含两条记录,所以update了两条记录)我反复检查代码,发现出问题的原因是出在Bean类中
package com.bestride.services.entity;import java.util.List;import com.bestride.services.dao.BaseDao;/**
 * 纳税户信息表
 * 
 * @author 蒋勇
 * 
 */
public class PlayerTaxCodeBean extends BaseBean {
private String code = ""; // 编码
private String player_code = ""; // 纳税人编码
private String tax_code = ""; // 税目信息
private String tax_rate = ""; // 税率信息
private String city_rate = ""; // 城建税
private String edu_rate = "";// 教育税
private String localedu_rate = ""; // 地方教育附加
private String flower_rate = ""; // 印花税
private String corp_rate = ""; // 企业所得税
private String person_rate = ""; // 个人所得税
private String use_flag = "TU_001"; // 税目标志
private String use_flag_name = "";// 税目状态
private String tax = "";// 税目名称 private static BaseDao taxInfoDao = null;// 查询税目名称所用Dao public String getTax() {
if(taxInfoDao!=null){
    PlayerTaxCodeBean taxBean = new PlayerTaxCodeBean();
    taxBean.setTax_code(this.getTax_code());
    List list = this.getTaxInfoDao().getInfoList(taxBean);
    if(list.size()>0)
     return (String)this.getTaxInfoDao().getInfoList(taxBean).get(0);
}
return "";
} public void setTax(String tax) {
this.tax = tax;
} public String getCode() {
return code;
} public void setCode(String code) {
this.code = code;
} public String getPlayer_code() {
return player_code;
} public void setPlayer_code(String player_code) {
this.player_code = player_code;
} public String getTax_code() {
return tax_code;
} public void setTax_code(String tax_code) {
this.tax_code = tax_code;
} public String getTax_rate() {
return tax_rate + "%";
} public void setTax_rate(String tax_rate) {
this.tax_rate = tax_rate;
} public String getCity_rate() {
return city_rate + "%";
} public void setCity_rate(String city_rate) {
this.city_rate = city_rate;
} public String getEdu_rate() {
return edu_rate + "%";
} public void setEdu_rate(String edu_rate) {
this.edu_rate = edu_rate;
} public String getLocaledu_rate() {
return localedu_rate + "%";
} public void setLocaledu_rate(String localedu_rate) {
this.localedu_rate = localedu_rate;
} public String getFlower_rate() {
return flower_rate + "%";
} public void setFlower_rate(String flower_rate) {
this.flower_rate = flower_rate;
} public String getCorp_rate() {
return corp_rate + "%";
} public void setCorp_rate(String corp_rate) {
this.corp_rate = corp_rate;
} public String getPerson_rate() {
return person_rate + "%";
} public void setPerson_rate(String person_rate) {
this.person_rate = person_rate;
} public String getUse_flag() {
return use_flag;
} public void setUse_flag(String use_flag) {
this.use_flag = use_flag;
} public String getUse_flag_name() {
if (this.use_flag == null) {
return "";
}
return com.bestride.framework.servlet.ResourceManager.getInstance()
.getNameByCode("com.bestride.services.entity.SystemSourceBean",
use_flag, "source_name");
} public void setUse_flag_name(String use_flag_name) {
this.use_flag_name = use_flag_name;
} public BaseDao getTaxInfoDao() {
return taxInfoDao;
} public void setTaxInfoDao(BaseDao taxInfoDao) {
this.taxInfoDao = taxInfoDao;
}}我的Bean类中每一个get方法中return的不是属性本身,而是加上一个百分号"%",只要我去掉这一步,也就是只return属性本身,就不会出现update语句
但是我return后+"%"是因为业务的需要,而且这似乎对每一个实体Bean本身不影响吧?属性的值没有改变,只是在调用get方法时的返回值会加上%而已那么,这是为什么?为什么会出现update
我将Dao中的find方法换成get,同样会出现update语句
但是换成findByNamedQuery,然后将select写入配置文件中,则不会出现update语句(即使+上百分号!)最后一点,hibernateTemplate执行find方法或者get方法的具体过程能不能帮忙描述一下,为什么会在Bean本身没有改变而只是调用get方法的时候结果不同去执行update。