求大侠指教:报错信息如下:java.sql.SQLException: ORA-01407: 无法更新 ("DRP"."T_ITEMS"."CATEGORY") 为 NULL at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:966)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1170)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3339)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3423)
at com.drp.basedata.dao.ItemDao4OracleImpl.modifyItem(ItemDao4OracleImpl.java:260)
at com.drp.basedata.managerImpl.ItemManagerImpl.modifyItem(ItemManagerImpl.java:88)
at org.apache.jsp.basedata.item_005fmodify_jsp._jspService(item_005fmodify_jsp.java:80)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.drp.util.filter.CharsetEncodingFilter.doFilter(CharsetEncodingFilter.java:29)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:619)
jsp部分页面代码如下,即一个下拉列表,取得值后存入数据库中 <td>
<%
List itemCategoryList = DataDictManager.getInstance().getItemCategoryListt();
%>
<select name="category" class="select1" id="category">
<%
for (Iterator iter=itemCategoryList.iterator(); iter.hasNext(); ) {
ItemCategory ic = (ItemCategory)iter.next();
String selectedStr = "";
if (ic.getId().equals(item.getCategory().getId())) {
selectedStr = "selected";
}
%>
<option value="<%=ic.getId() %>" <%=selectedStr %>><%=ic.getName() %></option>
<%
}
%>
</select>
</td>
com.drp.basedata.managerImpl.ItemManagerImpl.modifyItem方法: public void modifyItem(Item item) {
Connection conn = null;
try {
conn = DB.getConnection();
itemDaoFactory.createItemDao().modifyItem(conn, item);
}catch(DBException e) {
throw new AppException("数据库连接失败,请联系系统管理员!");
}catch(DaoException e) {
throw new AppException("物料修改失败!");
}finally {
DB.close(conn);
}
}
com.drp.basedata.dao.ItemDao4OracleImpl.modifyItem方法: public void modifyItem(Connection conn, Item item) {
String sql = "update t_items set item_name=?, spec=?, pattern=?, category=?, unit=? where item_no=?";
PreparedStatement pstmt = null;
try {
conn = DB.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, item.getItemName());
pstmt.setString(2, item.getSpec());
pstmt.setString(3, item.getPattern());
pstmt.setString(4, item.getCategory().getId());
pstmt.setString(5, item.getUnit().getId());
pstmt.setString(6, item.getItemNo());
System.out.println("111111111");
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DB.close(pstmt);
}
}

解决方案 »

  1.   

    你在try {
                conn = DB.getConnection();
                pstmt = conn.prepareStatement(sql);
                pstmt.setString(1, item.getItemName());
                pstmt.setString(2, item.getSpec());
                pstmt.setString(3, item.getPattern());
                pstmt.setString(4, item.getCategory().getId());
                pstmt.setString(5, item.getUnit().getId());
                pstmt.setString(6, item.getItemNo());
                System.out.println("111111111");
                pstmt.executeUpdate();
            }
    加断点,看看要更新的每个值是不是获取到了。估计是,部分没有获取到,有NULL啊。
      

  2.   

    modifyItem(conn,item)调用的control贴出来看看,问题应该出在那里
      

  3.   

      if (ic.getId().equals(item.getCategory().getId())) {//这个item哪来的啊?
      

  4.   

    at com.drp.basedata.dao.ItemDao4OracleImpl.modifyItem(ItemDao4OracleImpl.java:260)断点看看值是否都在。
      

  5.   

     ORA-01407: 无法更新 ("DRP"."T_ITEMS"."CATEGORY") 为 NULLcategory这个属性没有获取到值,估计问题就在这
      

  6.   

    java.sql.SQLException: ORA-01407: 无法更新 ("DRP"."T_ITEMS"."CATEGORY") 为 NULL
    异常已经说的很清楚了,楼主就从页面开始,一步步看下到底走到哪变成null的
      

  7.   

    先看这个值是什么item.getCategory().getId(),估计这是空的。。