测试的类这样的public class TestDAO {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");

//System.out.println(ctx);
    MaodieDAO mm=MaodieDAO.getFromApplicationContext(ctx);
Maodie mmm=new Maodie();
mmm.setId("3");
mmm.setName("3");
mm.save(mmm);//执行到这里出错
System.out.println("over"); }}
applicationContext.xml配置如下
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver">
</property>
<property name="url"
value="jdbc:oracle:thin:@192.168.1.203:1521:ora9i">
</property>
<property name="username" value="mobilehelper"></property>
<property name="password" value="123"></property>
</bean>


<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle9Dialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/maodie/po/Maodie.hbm.xml</value></list>
</property></bean>
<bean id="MaodieDAO" class="com.maodie.dao.MaodieDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>

</bean>

</beans>
最后会出现这样的错误
opening JDBC connection
insert into MOBILEHELPER.MAODIE (NAME, ID) values (?, ?)
Executing batch size: 1
about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
Could not execute JDBC batch update [insert into MOBILEHELPER.MAODIE (NAME, ID) values (?, ?)]
java.sql.BatchUpdateException: ORA-01401: inserted value too large for column at oracle.jdbc.dbaccess.DBError.throwBatchUpdateException(DBError.java:459)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:3907)
at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:297)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:985)
at org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:390)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:373)
at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:632)
at com.maodie.dao.MaodieDAO.save(MaodieDAO.java:36)
at com.maodie.test.TestDAO.main(TestDAO.java:21)我的数据库是oracle
表MAODIE的2个字段类型都是varchar(25)
我直接在数据库里操作insert into MOBILEHELPER.MAODIE (NAME, ID) values (3, 3)
或者insert into MOBILEHELPER.MAODIE (NAME, ID) values ('3', '3')都不会出错Maodie.hbm.xml的配置如下<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.maodie.po.Maodie" table="MAODIE" schema="MOBILEHELPER">
        <id name="id" type="java.lang.String">
            <column name="ID" length="5" />
            <generator class="uuid.hex" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" length="5" />
        </property>
    </class>
</hibernate-mapping>

解决方案 »

  1.   

    原因:
    Maodie.hbm.xml中的<generator class="uuid.hex" />
    Hibernate会生成一个32位16进制数字的字符串当成id的值
    程序中的mmm.setId("3")对id设值不会起作用修改:
    方法一:
    1.修改数据库字段的长度
    2.将<column name="ID" length="5" />中的5改成32
    用此方法数据库中ID的值为32位16进制数字的字符串方法二:
    1.将<generator class="uuid.hex" />改成
      <generator class="assigned" />
    用此方法数据库中ID的值为3
      

  2.   

    感谢yelongyelong ,按照你的方法确实把这个问题解决了,可是新问题又出现了,程序会执行在save方法的下面这句挂住,就是程序没结束而在这里等待。 public void save(Maodie transientInstance) {
    log.debug("saving Maodie instance");
    try {
    getHibernateTemplate().save(transientInstance);//程序在这里挂起等待,不再执行
    log.debug("save successful");
    } catch (RuntimeException re) {
    log.error("save failed", re);
    throw re;
    }
    }
    当然数据也肯定不能插进去,若不用save方法而用find方法,程序能正常执行。这个问题是什么原因呢?
    谢谢~
      

  3.   

    <generator class="uuid.hex" />这一步的配置实际上是生成了一个uuid的32位的字符串,被插入了数据库表中,用来唯一表示一条数据。所以如1楼所说的方式改正应该可以运行成功了。
      

  4.   


            ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
            
            //System.out.println(ctx);
            MaodieDAO mm=MaodieDAO.getFromApplicationContext(ctx);把你的MaodieDAO代码完整的贴出来看看