首先谢谢你能看我的帖子 麻烦各位浪费一些宝贵时间帮我看看 谢谢了 小弟搞了好久了 这个问题困扰我很久也没有解决所以万不得已来这里请教高人了 接下来我来叙述一下我的问题吧首先我使用的是MYSQL数据库 然后我在这个数据库中建立了一个USER表 其中有一个外键(INT类型) 指向了一个 身份证类型的表简单说就是外键表 接着我使用SPRING对HIBERNATE进行管理 还有就是使用HIBERNATE自动生成了 USER表和身份证类型这两张表 生成的.hbm.xml文件内容分别如下
USER.hbm.xml
<hibernate-mapping>
<class name="com.forum.pojo.User" table="user" catalog="forum">
<id name="id" type="java.lang.Integer">
<column name="Id" />
<generator class="native" />
</id>
<many-to-one name="card" class="com.forum.pojo.Card" fetch="select">
<column name="ucard" />
</many-to-one>===================(这个就是外键表 身份证类型那个表)
<property name="username" type="java.lang.String">
<column name="username" length="20" />
</property>
<property name="password" type="java.lang.String">
<column name="password" length="20" />
</property>
<property name="tusername" type="java.lang.String">
<column name="tusername" length="10" />
</property>
<property name="qq" type="java.lang.String">
<column name="qq" length="10" />
</property>
<property name="email" type="java.lang.String">
<column name="email" length="20" />
</property>
<property name="call" type="java.lang.String">
<column name="call" length="10" />
</property>
<property name="cardnumber" type="java.lang.String">
<column name="cardnumber" length="20" />
</property>
<property name="integral" type="java.lang.Integer">
<column name="Integral" />
</property>
</class>
</hibernate-mapping>
接下来是身份证类型这个表的.hbm.xml配置文件
<hibernate-mapping>
<class name="com.forum.pojo.Card" table="card" catalog="forum">
<id name="id" type="java.lang.Integer">
<column name="Id" />
<generator class="native" />
</id>
<property name="cardtype" type="java.lang.String">
<column name="cardtype" length="10" />
</property>
<set name="users" inverse="true">
<key>
<column name="ucard" />
</key>
<one-to-many class="com.forum.pojo.User" />
</set>
</class>
</hibernate-mapping>最后我使用了this.getHibernateTemplate().save(user);来完成添加现在我在写一个TEST测试类 来测试看能不能插入 下面就是测试类ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
IUserDao dao = (IUserDao)context.getBean("UserDao");
User user = new User();
Card c = new Card();---身份类型表 c.setCardtype("身份证");
user.setCard(c);
user.setUsername("Alex_SuTao");
user.setPassword("123456");
user.setEmail("[email protected]");
user.setCardnumber("610404198708210511");
user.setTusername("sutao");
user.setQq("357382027");
user.setIntegral(1000);
user.setCall("15877346240");
dao.save(user);
运行测试类结果就报错如下 Exception in thread "main" org.springframework.dao.InvalidDataAccessResourceUsageException: could not insert: [com.forum.pojo.User]; nested exception is org.hibernate.exception.SQLGrammarException: could not insert: [com.forum.pojo.User]
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:615)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:690)
at com.forum.user.dao.IDao.IUserDao.save(IUserDao.java:28)
at com.forum.test.Test.main(Test.java:41)
Caused by: org.hibernate.exception.SQLGrammarException: could not insert: [com.forum.pojo.User]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:40)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2163)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2643)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:51)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:298)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:693)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
... 4 more
Caused by: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'call, cardnumber, Integral) values (null, null, 'Alex_SuTao', '123456', 'sutao',' at line 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2822)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1536)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1626)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3031)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:943)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1184)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1101)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1086)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:102)
at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:73)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:33)
... 21 more麻烦各位浪费一些宝贵时间帮我看看 谢谢了 小弟搞了好久了
USER.hbm.xml
<hibernate-mapping>
<class name="com.forum.pojo.User" table="user" catalog="forum">
<id name="id" type="java.lang.Integer">
<column name="Id" />
<generator class="native" />
</id>
<many-to-one name="card" class="com.forum.pojo.Card" fetch="select">
<column name="ucard" />
</many-to-one>===================(这个就是外键表 身份证类型那个表)
<property name="username" type="java.lang.String">
<column name="username" length="20" />
</property>
<property name="password" type="java.lang.String">
<column name="password" length="20" />
</property>
<property name="tusername" type="java.lang.String">
<column name="tusername" length="10" />
</property>
<property name="qq" type="java.lang.String">
<column name="qq" length="10" />
</property>
<property name="email" type="java.lang.String">
<column name="email" length="20" />
</property>
<property name="call" type="java.lang.String">
<column name="call" length="10" />
</property>
<property name="cardnumber" type="java.lang.String">
<column name="cardnumber" length="20" />
</property>
<property name="integral" type="java.lang.Integer">
<column name="Integral" />
</property>
</class>
</hibernate-mapping>
接下来是身份证类型这个表的.hbm.xml配置文件
<hibernate-mapping>
<class name="com.forum.pojo.Card" table="card" catalog="forum">
<id name="id" type="java.lang.Integer">
<column name="Id" />
<generator class="native" />
</id>
<property name="cardtype" type="java.lang.String">
<column name="cardtype" length="10" />
</property>
<set name="users" inverse="true">
<key>
<column name="ucard" />
</key>
<one-to-many class="com.forum.pojo.User" />
</set>
</class>
</hibernate-mapping>最后我使用了this.getHibernateTemplate().save(user);来完成添加现在我在写一个TEST测试类 来测试看能不能插入 下面就是测试类ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
IUserDao dao = (IUserDao)context.getBean("UserDao");
User user = new User();
Card c = new Card();---身份类型表 c.setCardtype("身份证");
user.setCard(c);
user.setUsername("Alex_SuTao");
user.setPassword("123456");
user.setEmail("[email protected]");
user.setCardnumber("610404198708210511");
user.setTusername("sutao");
user.setQq("357382027");
user.setIntegral(1000);
user.setCall("15877346240");
dao.save(user);
运行测试类结果就报错如下 Exception in thread "main" org.springframework.dao.InvalidDataAccessResourceUsageException: could not insert: [com.forum.pojo.User]; nested exception is org.hibernate.exception.SQLGrammarException: could not insert: [com.forum.pojo.User]
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:615)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:690)
at com.forum.user.dao.IDao.IUserDao.save(IUserDao.java:28)
at com.forum.test.Test.main(Test.java:41)
Caused by: org.hibernate.exception.SQLGrammarException: could not insert: [com.forum.pojo.User]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:40)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2163)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2643)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:51)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:298)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:693)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
... 4 more
Caused by: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'call, cardnumber, Integral) values (null, null, 'Alex_SuTao', '123456', 'sutao',' at line 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2822)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1536)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1626)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3031)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:943)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1184)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1101)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1086)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:102)
at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:73)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:33)
... 21 more麻烦各位浪费一些宝贵时间帮我看看 谢谢了 小弟搞了好久了
你在dao.save(user); 前面加上user.setUcard(c); c.getUsers().add(user);
不知道对你有帮助没
你在dao.save(user); 前面加上user.setUcard(c); c.getUsers().add(user);
还有: values (null, null, 'Alex_SuTao', '123456', 'sutao',' at line 1 怎么会有2个null,你设了2列自增吗?
<column name="Id" />
<generator class="identity" />
</id> 把所有hibernate映射文件的主键生成策略都改成identity试试
身份证类型这个表还没保存产生ID,你User表引用肯定为空1 <id name="id" type="java.lang.Integer">
<column name="Id" />
<generator class="identity" />
</id>
2
先保存身份证类型这个表