一个关于Hibernate的问题

soaring_roc 2005-12-15 05:42:53
使用Hibernate实现ORM
映射文件如下:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<class name="test_hibernate.user" table="user">

<id name="id" column="id" type="int">

</id>

<property name="name" column="name" type="string" not-null="true"/>
<property name="age" column="age" type="int" not-null="true"/>

</class>

</hibernate-mapping>
...全文
117 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
soaring_roc 2005-12-16
  • 打赏
  • 举报
回复
我的id字段确实是主键,但是class中的id元素的generator元素不是必须的,所以这里没有用自动构造标识符的方法。
问题已经解决,正如wengzuliang(Jeff)所说的那样,user是sql server的关键字。谢谢!
同时,感谢yinleiyoung(星际孤虹)关于代码规范的建议!
yinleiyoung 2005-12-16
  • 打赏
  • 举报
回复
看你的意思,好像id是数据库自动生成的主键,写法应该这样:
<id name="id" column="id" type="long">
<generator class="identity"/>
</id>

还有,楼主的类名最好用大写字母开头,对象名最好不要和类名一样,很难维护而且容易出错
建议,还有user可以用,不是关键字,我用过的
wengzuliang 2005-12-15
  • 打赏
  • 举报
回复
user是关键字,改成其他的比如 tb_user
soaring_roc 2005-12-15
  • 打赏
  • 举报
回复
但是运行时出现如下错误:

Hibernate: insert into user (name, age, id) values (?, ?, ?)

17:29:06,921 WARN JDBCExceptionReporter:71 - SQL Error: 156, SQLState: HY000

17:29:06,921 ERROR JDBCExceptionReporter:72 - [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]在关键字 'user' 附近有语法错误。

17:29:06,937 ERROR AbstractFlushingEventListener:299 - Could not synchronize database state with session

org.hibernate.exception.GenericJDBCException: could not insert: [test_hibernate.user]

at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:91)

at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:79)

at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)

at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2077)

at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2426)

at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:51)

at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:243)

at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:227)

at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)

at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296)

at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)

at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:877)

at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:345)

at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)

at test_hibernate.userService.saveUser(userService.java:59)

at test_hibernate.first.doGet(first.java:25)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:190)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)

at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)

at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2347)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)

at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)

at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)

at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1027)

at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1125)

at java.lang.Thread.run(Thread.java:534)

Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]在关键字 'user' 附近有语法错误。

at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)

at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)

at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processErrorToken(Unknown Source)

at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processReplyToken(Unknown Source)

at com.microsoft.jdbc.sqlserver.tds.TDSRPCRequest.processReplyToken(Unknown Source)

at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processReply(Unknown Source)

at com.microsoft.jdbc.sqlserver.SQLServerImplStatement.getNextResultType(Unknown Source)

at com.microsoft.jdbc.base.BaseStatement.commonTransitionToState(Unknown Source)

at com.microsoft.jdbc.base.BaseStatement.postImplExecute(Unknown Source)

at com.microsoft.jdbc.base.BasePreparedStatement.postImplExecute(Unknown Source)

at com.microsoft.jdbc.base.BaseStatement.commonExecute(Unknown Source)

at com.microsoft.jdbc.base.BaseStatement.executeUpdateInternal(Unknown Source)

at com.microsoft.jdbc.base.BasePreparedStatement.executeUpdate(Unknown Source)

at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23)

at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2061)

... 42 more

17:29:06,984 WARN JDBCExceptionReporter:48 - SQL Warning: 0, SQLState:

17:29:07,000 WARN JDBCExceptionReporter:49 - [Microsoft][SQLServer 2000 Driver for JDBC]Database changed to test

17:29:07,000 WARN JDBCExceptionReporter:48 - SQL Warning: 0, SQLState:

17:29:07,015 WARN JDBCExceptionReporter:49 - [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]已将数据库上下文改为 'test'。

17:29:07,015 WARN JDBCExceptionReporter:48 - SQL Warning: 0, SQLState:

17:29:07,015 WARN JDBCExceptionReporter:49 - [Microsoft][SQLServer 2000 Driver for JDBC]Language changed to 简体中文

17:29:07,015 WARN JDBCExceptionReporter:48 - SQL Warning: 0, SQLState:

17:29:07,031 WARN JDBCExceptionReporter:49 - [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]已将语言设置改为 简体中文。

由于偶是新手,请大虾给予指正!谢谢!
soaring_roc 2005-12-15
  • 打赏
  • 举报
回复
properties文件如下:

hibernate.dialect=org.hibernate.dialect.SQLServerDialect
hibernate.connection.driver_class=com.microsoft.jdbc.sqlserver.SQLServerDriver
hibernate.connection.url=jdbc:microsoft:sqlserver://xxx.xxx.xx.xx:1433;DatabaseName=test
hibernate.connection.username=sa
hibernate.connection.password=
hibernate.show_sql=true

程序文件如下:

import org.hibernate.*;
import org.hibernate.cfg.*;
import javax.servlet.*;
import java.io.*;
import java.util.*;

public class userService{
public static SessionFactory sessionFactory;
static{
try{
// Create a configuration based on the properties file we've put
// in the standard place.
Configuration config = new Configuration();
config.addClass(user.class);
// Get the session factory we can use for persistence
sessionFactory = config.buildSessionFactory();
System.out.println("in the static place!");
}catch(Exception e){e.printStackTrace();}
}

public boolean saveUser(user user) throws Exception{

Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.save(user);
tx.commit();
}catch (Exception e) {
if (tx != null) {
tx.rollback();
return false;
}
throw e;
} finally {
session.close();
}
return true;
}
}

81,122

社区成员

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

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