1. 程式人生 > >hibernate的常見錯誤解決方法

hibernate的常見錯誤解決方法

1、

org.springframework.orm.ObjectRetrievalFailureException: Object of class [com.xindeco.myregister.pojo.MyRegisterInfo] with identifier [14]: not found

MyRegisterInfo在資料庫沒有identifier [14]物件。

2、

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is org.hibernate.MappingException: Repeated column in mapping for entity: com.xindeco.myregister.pojo.MyRegisterInfo column: password (should be mapped with insert="false" update="false")

出錯原因:password 和repassword同時對應資料庫表中的password一列,同時update和insert都設為true。

xml檔案如下:

    <property name="password"

                          type="java.lang.String"

                          update="true"

                          insert="true"

                          access="property"

                          column="password"

                          length = "32"

                          />

                         <property name="repassword"

                          type="java.lang.String"

                          update="false"

                          insert="false"

                          access="property"

                          column="password"

                          length = "32"

                          />

解決的方法:

將repassword的insert和update設為false。

3、

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed;

nested exception is org.hibernate.PropertyNotFoundException: Could not find a getter for ID in class

錯誤原因:hibernate的對映檔案中ID是大寫的,而pojo的類中id是小寫的

注意事項:每個pojo的類都要繼承abstractEntity,其中abstractEntity類有個ID的屬性要重寫

public abstract class AbstractEntity

    implements Entity, BaseDTO {

    abstract public long getID();

    abstract public void setID(long id);

    public int hashCode() {

        return (int)this.getID();

    }

    public boolean equals(Object obj) {

        if (obj == this) {

            return true;

        }

        if (obj instanceof Entity) {

            return this.getID() == ( (Entity) obj).getID();

        }

        return false;

    }

}

4、

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition

錯誤原因:

在application.xml檔案中deleteRegister方法以delete開頭,並沒有被設定為可更改的,應如下設定:

<!--為事物建立代理類,並指定方法的事物型別-->

<bean id="baseTxProxy" lazy-init="true" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

    <property name="transactionManager">

      <ref bean="transactionManager"/>

    </property>

    <property name="transactionAttributes">

      <props>

        <prop key="add*">PROPAGATION_REQUIRED</prop>

        <prop key="cancel*">PROPAGATION_REQUIRED</prop>

           </props>

    </property>

</bean>

加上一行

<prop key="delete*">PROPAGATION_REQUIRED</prop>

5、

   ERROR org.apache.struts.util.RequestUtils - Error creating form bean of class com.xindeco.business.web.form.GraAppInfoForm

public class GraAppInfoForm

extends ActionForm 錯誤寫成

public abstratic class GraAppInfoForm

extends ActionForm

6、

2006-04-25 08:56:38,495 ERROR com.xindeco.business.web.action.GraAppAction - [email protected]

java.lang.ClassCastException: $Proxy0

at com.xindeco.business.web.action.GraAppAction.newone(GraAppAction.java:30)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:585)

at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)

at com.xindeco.core.web.action.BaseAction.dispatchMethod(BaseAction.java:153)

at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)

actioin類中的newone方法如下:

public class GraAppAction

    extends BaseAction {

    public ActionForward newone(ActionMapping mapping, ActionForm form,

                              HttpServletRequest request,

                              HttpServletResponse response) throws Exception {

       GraAppService graservice = (GraAppService) this.getBean("GraAppService");

}

applicationcontext中的GraAppService的配置如下:

    <bean id="GraAppDAO" class="com.xindeco.business.dao.impl.GraAppDAOImpl">

    <property name="support">

      <ref local="support"/>

    </property>

    <property name="sessionFactory">

      <ref local="sessionFactory"/>

    </property>

</bean>

<bean id="GraAppService" parent="baseTxProxy">

    <property name="target">

      <bean class="com.xindeco.business.service.impl.GraAppServiceImpl" autowire="byName">

        <property name="baseDAO">

          <ref bean="GraAppDAO"/>

        </property>

      </bean>

    </property>

</bean>

因此this.getBean("GraAppService");是為了得到GraAppServicImpl類的實現。GraAppService是interface

public class GraAppServiceImpl extends BaseServiceImpl

    implements GraAppService{

}

7、org.hibernate.hql.ast.QuerySyntaxException: Demand is not mapped. [from Demand where unitid = ? and needNum > usedNeedNum]

hibernate.cfg.xml沒有配置Demand.hbm.xml檔案的目錄

8、 org.springframework.jdbc.BadSqlGrammarException: Bad SQL grammar [] in task 'Hibernate operation'; nested exception is java.sql.SQLException: 列名 'id' 無效。

java.sql.SQLException: 列名 'name' 無效。

因為hibernate宣告的id,name的columnid屬性沒有與資料庫的欄位對應,所以id,name無效。

9、java.lang.NumberFormatException: null

at java.lang.Integer.parseInt(Integer.java:415)

at java.lang.Integer.parseInt(Integer.java:497)

at com.xindeco.business.service.impl.DemandServiceImpl.findDemandListByUnitId(DemandServiceImpl.java:33)

錯誤語句為

needNum = Integer.parseInt(demand.getNeedNum());

usedNeedNum = Integer.parseInt(demand.getUsedNeedNum());

因為demand.getUsedNeedNum()==null,無法轉化為string 型別,

10、rg.apache.jasper.JasperException: /GraAppInfo/GraAppInfoNew.jsp(343,29) According to TLD, tag bean:write must be empty, but is not

錯誤的原因:

       <select name="politicsID" >

             <option value="">請選擇</option>

       <logic:notEmpty name="politicsList">

                <logic:iterate id="politics" name="politicsList">

       </logic:notEmpty>

       <option value="<bean:write name="politics" property="codeID"/>"><bean:write name="politics" property="codeName"/></option>

       </logic:iterate>

</select>

就因為少了/>

以後懂得通過查詢字數,來檢查錯誤

11、2006-04-26 13:27:54,812 ERROR com.xindeco.core.util.BeanUtils - bean property [Nation] copy failed

com.xindeco.core.exception.ConvertException: org.springframework.orm.hibernate3.HibernateSystemException: Unknown entity: java.lang.String; nested exception is org.hibernate.MappingException: Unknown entity: java.lang.String

beanUtil.beanCopy(grapojo,form,BizConstants.CONVERTER);

要求:

1、pojo類的屬性只有與form屬性名字相同,才能beancopy成功

2、pojo中屬性是實體,在form中一定要用int,long表示

出現這錯誤的原因是pojo中的屬性不是實體,而錯誤寫成:

string

private String nation;應改成 private Syscode nation;

12、

2006-04-26 14:38:37,843 ERROR com.xindeco.business.web.action.GraAppAction - [email protected]

java.lang.NullPointerException

at com.xindeco.business.web.action.GraAppAction.newone(GraAppAction.java:43)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

hibernate配置檔案沒改,程式找不到相應的類

        <many-to-one

            name="FSUnit"

            class="com.xindeco.business.pojo.EmployUnitBaseInfo"

            cascade="none"

            outer-join="auto"

            update="true"

            insert="true"

            access="property"

            column="fSUnit"

        />

其實FSUnit對應的類應該是FSUnit

        <many-to-one

            name="FSUnit"

            class="com.xindeco.business.pojo.FSUnit"

            cascade="none"

            outer-join="auto"

            update="true"

            insert="true"

            access="property"

            column="fSUnit"

        />

13、

org.hibernate.MappingException: An association from the table GraAppInfo refers to an unmapped class: com.xindeco.business.pojo.FSUnit

錯誤原因:hibernate.cfg.xml沒有配置fsunit.hbm.xml檔案的位置

14、

java.lang.ClassCastException: com.xindeco.business.dao.impl.GraAppDAOImpl

at com.xindeco.business.service.impl.GraAppServiceImpl.addGraduateApp(GraAppServiceImpl.java:16)

GraAppServiceImpl.java:16

第16行: GraAppDAO dao = (GraAppDAO) this.getBaseDAO();//其實得到的是GraAppDAOImpl

錯誤的原因是

public class GraAppDAOImpl

    extends BaseDAOImpl {

}

沒有實現GraAppDAO介面,正確的做法是

public class GraAppDAOImpl

    extends BaseDAOImpl implements GraAppDAO {

}

先繼承後實現

15、2006-04-27 08:38:54,078 ERROR com.xindeco.business.web.action.GraAppAction - [email protected]

java.lang.ClassCastException: com.xindeco.business.pojo.SysCode

at org.hibernate.type.StringType.set(StringType.java:26)

at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:63)

at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:40)

一般是因為hibernate宣告型別和pojo類宣告的型別不一樣,並且前面已經出現了 Hibernate: insert into TGraAppInfo (name, whereFrom, degree, college, speciality, studentRelTel, remark, higherEduLength, highSchool, studyResume, normalOrNot, proxyUnit, workPost, workPlace, studentAddress, studentPostNumber, nation, appStatus) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

的操作提示,查出錯誤的原因有:

        <many-to-one

            name="demand"

            class="com.xindeco.business.pojo.Syscode"

            cascade="none"

            outer-join="auto"

            update="true"

            insert="true"

            access="property"

            column="demandID"

        />

         <property

            name="appStatus"

            type="int"

            update="true"

            insert="true"

            access="property"

            column="appStatus"

            length="10"

        />

應改為   

        <many-to-one

            name="demand"

            class="com.xindeco.business.pojo.Demand"

            cascade="none"

            outer-join="auto"

            update="true"

            insert="true"

            access="property"

            column="demandID"

        />

<many-to-one

            name="nation"

            class="com.xindeco.business.pojo.SysCode"

            cascade="none"

            outer-join="auto"

            update="true"

            insert="true"

            access="property"

            column="nation"

        />

16、

org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance - save the transient instance before flushing: com.xindeco.business.pojo.SysCode

at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:626)

at org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:570)

at

org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:482)

pojo類為:

public class GraAppInfo{

    private College college;

}

action 類為

public class GraAppAction

    extends BaseAction {

       public ActionForward add(ActionMapping mapping, ActionForm form,

                             HttpServletRequest request,

                             HttpServletResponse response) throws Exception {

        graInfo.setCollege(new College());//必須從資料庫找到college這個物件,而不能新生成

        graInfo.getCollege().setID(graForm.getCollegeID());

        graInfo.setAppStatus(Integer.parseInt("0"));

      service.addGraduateApp(graInfo);

}

public class GraAppServiceImpl extends BaseServiceImpl

    implements GraAppService{

    public boolean addGraduateApp(GraAppInfo info){

        this.getBaseDAO().save(info);

        return true;

    }

}

dao類save方法為

    getHibernateTemplate().save(obj);

當cascade="all",插入new college 除了id和原來的記錄一樣,其他的欄位全部都被更新,為null

當cascase=“insert”,插入new college 只會把它的id插入grainfo表中,其他欄位不變。

17、java.sql.SQLException: Unable to convert between java.lang.Integer and BLOB.

因為

        <property

            name="province"

            type="com.xindeco.business.pojo.SysCode"//不能用複雜類,

            update="true"

            insert="true"

            access="property"

            column="provinceId"

        />

應該改為

            <many-to-one

            name="province"

            class="com.xindeco.business.pojo.SysCode"

            cascade="none"

            outer-join="auto"

            update="true"

            insert="true"

            access="property"

            column="provinceId"

        />

18、javax.servlet.jsp.JspException: Cannot create iterator for this collection

at org.apache.struts.taglib.logic.IterateTag.doStartTag(IterateTag.java:265)

jsp檔案如下:

   <logic:notEmpty name="graduateList" >

   <logic:iterate id="graduate" name="graduateList" >

   </ogic:notEmpty >

   </ogic:iterat>

graduateList是一個類,而logic:iterator要求必須是ArrayList,HashSet....這樣的集合類,而graduateList中一個屬性是ArrayList或HashSet的

應改為:

<logic:notEmpty name="graduateList" property="items">

<logic:iterate id="graduate" name="graduateList" property="items" >

</ogic:notEmpty >

</ogic:iterat>

19、2006-05-11 17:13:37,468 ERROR com.xindeco.business.web.action.GraAppAction - [email protected]

org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed

SysUser user= (SysUser) request.getSession().getAttribute(WebConstants.SESSION_USER);

System.out.println(user.getRole().getRoleName());

當hibernate session取出資料放到http session時,

由於sysuser中role的lazy=“true”,所以沒有將RoleName放到http session中,當System.out.println(user.getRole().getRoleName());

時,雖然http session還開著, hibernat seesion已經關閉

        <many-to-one

            name="role"

            class="com.xindeco.business.pojo.SysRole"

            lazy="false"

            cascade="none"

            outer-join="auto"

            update="true"

            insert="true"

            access="property"

            column="roleID"

        />

20、Association references unmapped class: com.xindeco.workflow.WFNode

因為application.xml檔案中沒有配置<mapping resource="com/xindeco/workflow/WFNode.hbm.xml"/>

系統找不到WFNode

         < set

     name = " nodes "

            table = " WF_ROLENODES "

            lazy = " true "

            inverse = " false "

            cascade = " none "

            sort = " unsorted "

         >

< key column = " roleID " > </ key >               

< many - to - many

         class = " com.xindeco.workflow.WFNode "

         column = " nodeId "

         outer - join = " auto " />

         </ set >