这段时间老总要我修改公司原先的人做的项目,是采用spring+struts+hibernate+ajax做得,要求将数据库改为oracle(以前的是mysql)。我对hibernate,无赖老总要求,只得边学边改。通过使用myeclipse来生成的映射文件,能按照数据库表来生成映射文件。但这样生成的映射文件确保一定能用。
如,有以下映射文件
<hibernate-mapping>
<class name="com.hibernate.temp.News" table="NEWS" schema="PIRATESTUDIO">
<id name="id" type="java.lang.Long">
<column name="ID" precision="10" scale="0" />
<generator class="assigned" />
</id>
<property name="NType" type="java.lang.String">
<column name="N_TYPE" length="10" not-null="true" />
</property>
<property name="NTitle" type="java.lang.String">
<column name="N_TITLE" length="50" not-null="true" />
</property>
<property name="NContent" type="java.lang.String">
<column name="N_CONTENT" not-null="true" />
</property>
<property name="NIp" type="java.lang.String">
<column name="N_IP" length="20" not-null="true" />
</property>
<property name="NTime" type="java.util.Date">
<column name="N_TIME" length="7" not-null="true" />
</property>
<property name="NRRate" type="java.lang.Long">
<column name="N_R_RATE" precision="10" scale="0" not-null="true" />
</property>
<property name="NTypeT" type="java.lang.Long">
<column name="N_TYPE_T" precision="10" scale="0" not-null="true" />
</property>
<property name="NComm" type="java.lang.Long">
<column name="N_COMM" precision="10" scale="0" not-null="true" />
</property>
<property name="NIsedit" type="java.lang.Long">
<column name="N_ISEDIT" precision="10" scale="0" not-null="true" />
</property>
</class>
当我在使用hibernate的getHiberbnateTemplate().getDelete(entity)时,就会报以下错误
javax.servlet.ServletException: org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value: com.GameServer.Entity.News.NTitle; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value: com.GameServer.Entity.News.xxxx(xxxx是映射未见中的column的name)
这是因为我在映射文件中使用not-null="true" 这使用delete()方法是系统会根据not-null来检查相应的值。而我的entity中只用id是不为null,其余是null。因此报错。
通过这个可以得出,hiberbnate的映射文件最好自己来写,这样才能达到灵活性。