hibernate 的小问题,不能插入~ 求救各位

maodie007 2008-02-29 12:04:20
测试的类这样的

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>
...全文
167 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yelongyelong 2008-02-29
  • 打赏
  • 举报
回复
原因:
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
yelongyelong 2008-02-29
  • 打赏
  • 举报
回复

ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");

//System.out.println(ctx);
MaodieDAO mm=MaodieDAO.getFromApplicationContext(ctx);

把你的MaodieDAO代码完整的贴出来看看
jll24 2008-02-29
  • 打赏
  • 举报
回复
<generator class="uuid.hex" />

这一步的配置实际上是生成了一个uuid的32位的字符串,被插入了数据库表中,用来唯一表示一条数据。所以如1楼所说的方式改正应该可以运行成功了。
kongwei302 2008-02-29
  • 打赏
  • 举报
回复
LZ你用户名真强
maodie007 2008-02-29
  • 打赏
  • 举报
回复
感觉是那种数据库事务没提交一样
maodie007 2008-02-29
  • 打赏
  • 举报
回复
感谢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方法,程序能正常执行。这个问题是什么原因呢?
谢谢~

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧