`
FansUnion
  • 浏览: 153294 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

2013年工作中遇到的20个问题:221-240

 
阅读更多

221.Eclipse下的Tomcat部署总是旧的文件。
比如今天是9号,发布的文件却一直是8号的。
最终,删除Tomcat重新部署还是不行。
解决办法是:重启Eclipse后,第2天来重新发布就好了。

222.单元测试搞混了。
以前专门写了针对SpringMVC+Spring+Mybatis架构的单元测试基础类。
现在有个就项目MVC框架用的是Struts2,这时Service还可以用以前的那个,而测试Action就不行了。
所以,需要重新学习和实践单元测试Struts2.

223.Apache POI获取Excel单元格的行数和列数、Sheet个数。

int coloumNum=sheet.getRow(0).getPhysicalNumberOfCells();//获得总列数
 int rowNum=sheet.getLastRowNum();//获得总行数
  int sheetNum = templateWorkbook.getNumberOfSheets();//sheet的个数
 



一段时间不弄POI,API好多都忘记了。


224.SQLServer迁移到MySQL。
SQLServer->Access->MySQL
这种方式存在的问题:数据库表名大小写存在问题,字段的类型不够准确,比如varchar转成了longtext。
需要手动修改不少数据库设计。

225.Hibernate多数据源切换。
public Session getSessionByProjectId(int projectId);
不同的项目返回不同的数据库Session。
其它地方都是好的,今天实现新功能的时候发现Session切换不成功。
后来,发现是事务引起的问题。
@Transactional(value = "project", readOnly = false, propagation = Propagation.REQUIRED)
public void method();

method内部有多个dao,有操作固定数据库db的dao,有根据projectId切换session的dao。
后来,为了寻找错误原因,仅仅写了个只包含getSessionByProjectId一个方法调用的测试方法,通过了,
进而推断出是事务的问题。

现在,是分2个方法来实现事务,虽然不是最好的,却是最方便的。

public void method(){
 method1();
 method2();
} 

@Transactional(value = "project", readOnly = false, propagation = Propagation.REQUIRED)
 method1();
 
 @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
 method2();
 



226.重写优于重构。
项目中有个需求是根据一个具有父子关系的表结构构造一个Tree,由于原来的代码看起来很难懂,
加上最近需求发生大量变更,在原有代码基础上不断修改的过程中,总是有点小问题。
递归,循环,判断很混乱。
最后,决定重写,1天时间写好并测试通过。

227.更新某个字段为null的行。
UPDATE TSide set tags="mTags" where tags is null;
在MySQL Front的SQL编辑器中中,null和NULL都给的是“关键字”颜色。
应该用小写的null。

228.Linux杀死Java进程。
Linux命令:killall用于杀死指定名字的进程(kill processes by name)。
我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀死的进程,我们还需要在之前使用ps等命令再配合grep来查找进程,
而killall把这两个过程合二为一,这真是一个太好用的命令了。

同事Linux机器上的Eclipse卡死了,啥也不能干,只能强制删除。
我以前只知道用kill,每次还必须先知道进程id,现在有了更好的方法。
在帮助别人的过程中,也学习到了新的东东。

229.Tomcat部署后启动,经常提示找不到某个类,实际上这个类明明存在,只能删除然后重新发布项目。
目前不知道根本原因是啥。

230.滥用Hibernate。
根据id获取公司信息,咋搞这么复杂呢?
改进后代码:

public TcompanyInfo getCompanyInfo(int id) {
  TcompanyInfo info = super.get(id);
  return info;
 } 


原始代码:

public List<CompanyBean> getCompanyInfoByID(int id) {
        List<CompanyBean> list = new ArrayList<CompanyBean>();
        try {
            Session session = getCurrentSession();
            String querySql = "";
   //Windows切换到Linux,表名区分大小写后,SQL语句报语法错误
            querySql = String.format(
                    "Select * from TComapnyInfo where cID = %d ", id);
            Query query = session.createSQLQuery(querySql);
            List<Object[]> objList = query.list(); 

            int size = objList.size();
            for (int i = 0; i < size; i++) {
   //这种代码太难维护了
                CompanyBean cb = new CompanyBean();
                cb.setCompanyID(Integer.parseInt(objList.get(i)[0].toString()));
                cb.setCompanyName(handleNullObject(objList.get(i)[1]));
                cb.setLogoURL(handleNullObject(objList.get(i)[2]));
                list.add(cb);
            } 

        } catch (HibernateException e) {
            e.printStackTrace();
        }
        return list;
    }
 



231.一个奇怪的数据库问题。

// String oldSql =
   // "select ct.id as templateId,ct.chartTemplate,ct.description,ct.templateCode,ta.id as authId,ta.auth,ta.projectId
 from chartTemplate ct left outer join templateAuth ta on ct.templateCode = ta.templateCode "
   // + " and ta.projectId=:projectId";
 String sql = "select ct.id ,ct.chartTemplate,ct.description,ct.templateCode,ta.id as authId,ta.auth,ta.projectId 
from chartTemplate ct left outer join templateAuth ta on ct.templateCode = ta.templateCode "
     + " and ta.projectId=:projectId";
   
 Session s = super.getCurrentSession(); 

 Query query = s.createSQLQuery(sql);
 query.setParameter("projectId", tvo.getProjectId());
 List<Object[]> list = query.list();
   


使用oldSql在SQLServer中,没有问题,在MySQL中报异常。
九月 26, 2013 2:34:47 下午 org.hibernate.type.NullableType nullSafeGet
INFO: could not read column value from result set: id; Column 'id' not found.
九月 26, 2013 2:34:47 下午 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 0, SQLState: S0022
九月 26, 2013 2:34:47 下午 org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: Column 'id' not found. 

把“select ct.id as templateId”改为"select ct.id"就可以了。

232. Hibernate项目的数据库迁移问题。
不能在MySQL下运行,原来是在SQLServer下的。

select projectName,
  cast(DATEPART(year, visitTime) as varchar) +'-'+ cast(DATEPART(month, visitTime) as varchar)as month
 from visitLog
 



用了Hibernate却不能顺利迁移到MySQL,对Hibernate真是一个侮辱啊!

233.日期转换功能通过SQL脚本还是通过写程序来实现?
cast(DATEPART(year, visitTime) as varchar) +'-'+ cast(DATEPART(month, visitTime) as varchar
象这种功能,写成java函数多好?
"2011-08-11 11:22:43"转换成“2011-08”写成java函数多好啊!!!

234.数据库表名硬编码。
Windows下表名是不区分大小写的,而Linux下是区分的。
因此,在SQL中表名没有严格按照大小写,导致迁移出错。

表名不区分大小写的根本原因:Windows的文件是不支持大小写区分的,而Linux支持。

235.CSDN文章分类。
“小雷网”分类下有10篇文章,我现在不想要这个分类了。
原来的做法是,编辑每一篇文章,取消该文章的“小雷网”分类。
好的做法是:直接删除“小雷网”分类,系统会自动把所有该分类下的文章移除该分类。
(级联操作)

236.定位问题的方法。
Hibernate报了一个错误Could not parse mapping document from input stream。
下面是打印的信息:
INFO: Mapping class: * -> TProjectChart
九月 27, 2013 11:28:40 上午 org.hibernate.cfg.HbmBinder bindRootPersistentClassCommonValues
INFO: Mapping class: * -> TProjectKeyword
九月 27, 2013 11:28:40 上午 org.hibernate.cfg.HbmBinder bindRootPersistentClassCommonValues
INFO: Mapping class: * -> treport
九月 27, 2013 11:28:40 上午 org.hibernate.util.XMLHelper$ErrorLogger error
SEVERE: Error parsing XML: XML InputStream(5) 元素内容必须由格式正确的字符数据或标记组成。
经过分析,应该是Hibernate配置文件出错导致的。
看打印信息,应该是treport.hbm.xml这个配置文件附近的。
果然,是treport的下一个配置文件tside.hbm.xml存在语法错误。

之所以没有报错,是因为“语法错误是因为有版本冲突导致的”
<<mine r27
xml校验器,没有给出错误提示。

237.PowerDesigner 主键ID不能复用问题。
当设置主键后,主键ID不能在其他表中引用。
将在表设计的空白处右击,在菜单中选择"Model Options”,点掉Unique Code 前的复选框!
上大学学习PowerDesigner的时候遇到这个问题了,今天新人同事在群里问这个,我就顺便答复了。

238.分页功能维护一份sql。
List list();
Integer count();
2个函数最好维护一份sql代码。
这2个分页的子功能,大部分代码是一致的,尽可能只维护一份相同的sql,如构造通用的commonSql。

239.字符串拼接的“引号”问题。

Query query = session.createQuery(hql);
   if (projectName != null && !projectName.trim().equals("")) {
    query.setParameter("projectName", "%'" + projectName + "'%");
   }
   



正确的写法是query.setParameter("projectName", "%" + projectName + "%");
不需要那个“画蛇添足的引号”!!

查找count的时候也不需要设置分页参数。
query.setFirstResult((pageNo – 1) * pageSize);
query.setMaxResults(pageSize);
这也是“复制粘贴”引起的问题。
偷懒是可以的,“复制粘贴”这种偷懒的方法就太差劲了,还是要多动动脑子。

240.JS获取页面某个区域的表单参数。
//获取某一个div下的所有参数

function buildUpSearchParam(divId){
 var param = {};
 param["currentPage"] = 1;
 var paramInputs = $(":text" , $("#" + divId));
 for(var i=0;i<paramInputs.length;i++){
  param[paramInputs[i].id] = paramInputs[i].value;
 }
 return param;
 }
   



<div class="Trend_Rank" //id="paramDiv",id不应该放在这里,这个div包含了2个table>
<table width="50%" id="paramDiv" >
</table>

//这个table,表单组件自动插入了分页的按钮等,这样会多了<input type="button" value="goTo">。
导致向后端发送参数的时候会多发送1个project.goTO参数,project这个对象却没有这个属性,
出现OGNL没有这个属性的异常。
<table>

</table>

</table>

相关阅读

工作问题 http://blog.csdn.net/FansUnion/article/category/1334371

原文参见:http://fansunion.cn/articles/2605

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics