2013年工作中遇到的20个问题:221-240
2013年工作中遇到的20个问题:221-240221.Eclipse下的Tomcat部署总是旧的文件。224.SQLServer迁移到MySQL。226.重写优于重构。228.Linux杀死Java进程。233.日期转换功能通过SQL脚本还是通过写程序来实现?
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
更多推荐
所有评论(0)